我可以使用注释将原始变量注入模拟类吗?

Vov*_*syk 3 java spring unit-testing mocking mockito

例如我有处理程序:

@Component
public class MyHandler {

  @AutoWired
  private MyDependency myDependency;

  @Value("${some.count}")
  private int someCount;

  public int someMethod(){
    if (someCount > 2) {
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

测试它我写了以下测试:

@RunWith(MockitoJUnitRunner.class}
class MyHandlerTest {

  @InjectMocks
  MyHandler myHandler;

  @Mock
  MyDependency myDependency;

  @Test
  public void testSomeMethod(){
    ReflectionTestUtils.setField(myHandler, "someCount", 4);
    myHandler.someMethod();
  }
}
Run Code Online (Sandbox Code Playgroud)

我可以使用模拟变量some​​Count ReflectionTestUtils.我能以某种方式使用Mockito注释来模拟它吗?

lub*_*nac 5

只需使用构造函数注入:

@Component
public class MyHandler {
  private MyDependency myDependency;
  private int someCount;

  @Autowired
  public MyHandler(MyDependency myDependency,  
    @Value("${some.count}") int someCount){
      this.myDependency = myDependency;
      this.someCount = someCount;
  }

  public int someMethod(){
    if (someCount > 2) {
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

并且您不需要在测试中使用InjectMocks和反射.您将通过构造函数创建测试对象并传入someCount值.测试期间将忽略注释.


Jef*_*ica 0

没有内置的方法可以做到这一点,并且要注意@InjectMocks 也有它的缺点:Mockito 的 @InjectMocks 更多的是一种礼貌,而不是一个完全安全的功能,如果被测系统添加任何功能,它会默默地失败字段。

相反,请考虑创建用于测试的构造函数或工厂方法:虽然您的测试代码应该存在于测试中而不是生产类中,但您的测试是类的使用者,您可以为它们显式设计构造函数。

@Component
public class MyHandler {

  @AutoWired
  private MyDependency myDependency;

  @Value("${some.count}")
  private int someCount;

  /** Visible for testing. */
  MyHandler(MyDependency myDependency, int someCount) {
    this.myDependency = myDependency;
    this.someCount = someCount;
  }

  // ....
}
Run Code Online (Sandbox Code Playgroud)