在 Junit、Mockito 中模拟局部变量
Mock local variable in Junit, Mockito
我正在使用 Mockito 编写代码测试用例。代码看起来像这样,
public class Example {
@Autowired
private HelperService hs;
public void someMethod() {
List<String> names = new ArrayList<>();
hs.addValues(names);
if(names.size() < 5) {throw new RuntimeException("Invalid names list");}
return;
}
}
public class HelperService {
public void addValues(List<String> names) {
names.add("alex");
names.add("harry");
names.add("james");
names.add("maria");
names.add("bob");
}
}
我知道这是一个人为的例子,但我有一个类似的用例,我无法修改现有代码。我想使用 Junit、Mockito 对 Example class 进行单元测试。如何测试 names.size()
小于 5.
的异常情况
我假设您已经有办法在测试中设置 HelperService
字段(无论是将其设为 @SpringBootTest
、使用 @InjectMocks
还是其他方式别的)。因此,这只会提供选项,让您可以做自己想做的事:
- 扩展
HelperService
并注入:
// Inject this into your class under test
private HelperService hs = new LessThan5NameAddingHelperService();
class LessThan5NameAddingHelperService extends HelperService {
@Override
public void addNames( List<String> names ) {
names.add( "Dave" );
}
}
- 提供一个
mock
HelperService
做同样的事情:
// Inject this into your class under test
private HelperService hs;
@Before
public void setupMockHelperService() {
hs = mock( HelperService.class );
doAnswer( invocation -> {
List<String> names = ( List<String> ) invocation.getArguments()[0];
names.add( "Dave" );
return null;
} ).when( hs ).addNames( any() );
}
我正在使用 Mockito 编写代码测试用例。代码看起来像这样,
public class Example {
@Autowired
private HelperService hs;
public void someMethod() {
List<String> names = new ArrayList<>();
hs.addValues(names);
if(names.size() < 5) {throw new RuntimeException("Invalid names list");}
return;
}
}
public class HelperService {
public void addValues(List<String> names) {
names.add("alex");
names.add("harry");
names.add("james");
names.add("maria");
names.add("bob");
}
}
我知道这是一个人为的例子,但我有一个类似的用例,我无法修改现有代码。我想使用 Junit、Mockito 对 Example class 进行单元测试。如何测试 names.size()
小于 5.
我假设您已经有办法在测试中设置 HelperService
字段(无论是将其设为 @SpringBootTest
、使用 @InjectMocks
还是其他方式别的)。因此,这只会提供选项,让您可以做自己想做的事:
- 扩展
HelperService
并注入:
// Inject this into your class under test
private HelperService hs = new LessThan5NameAddingHelperService();
class LessThan5NameAddingHelperService extends HelperService {
@Override
public void addNames( List<String> names ) {
names.add( "Dave" );
}
}
- 提供一个
mock
HelperService
做同样的事情:
// Inject this into your class under test
private HelperService hs;
@Before
public void setupMockHelperService() {
hs = mock( HelperService.class );
doAnswer( invocation -> {
List<String> names = ( List<String> ) invocation.getArguments()[0];
names.add( "Dave" );
return null;
} ).when( hs ).addNames( any() );
}