在 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");
 }

}

我知道这是一个人为的例子,但我有一个类似的用例,我无法修改现有代码。我想使用 JunitMockitoExample class 进行单元测试。如何测试 names.size() 小于 5.

的异常情况

我假设您已经有办法在测试中设置 HelperService 字段(无论是将其设为 @SpringBootTest、使用 @InjectMocks 还是其他方式别的)。因此,这只会提供选项,让您可以做自己想做的事:

  1. 扩展 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" );
    }
}
  1. 提供一个 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() );
}