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

时间:2015-06-10 15:18:55

标签: 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) {
    ...
  }
}

测试它我写了以下测试:

@RunWith(MockitoJUnitRunner.class}
class MyHandlerTest {

  @InjectMocks
  MyHandler myHandler;

  @Mock
  MyDependency myDependency;

  @Test
  public void testSomeMethod(){
    ReflectionTestUtils.setField(myHandler, "someCount", 4);
    myHandler.someMethod();
  }
}

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

2 个答案:

答案 0 :(得分: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) {
    ...
  }
}

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

答案 1 :(得分:0)

没有内置的方法可以做到这一点,并注意@InjectMocks has its downsides as well:Mockito的@InjectMocks更加礼貌而不是完全安全的功能,如果被测系统增加,它将无声地失败任何领域。

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

affix-top