【问题标题】:Can I inject primitive variable into mocked class using annotation?我可以使用注释将原始变量注入模拟类吗?
【发布时间】:2015-06-10 15:18:55
【问题描述】:

例如我有处理程序:

@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 模拟变量 someCount。我可以使用 Mockito 注释以某种方式模拟它吗?

【问题讨论】:

  • 这个答案给出了我们使用的替代方案:为您的测试创建一个 Properties bean,并让 Spring 将这些值连接到 @Value 注释中:stackoverflow.com/a/23224535/1777072

标签: java spring unit-testing mocking mockito


【解决方案1】:

只需使用构造函数注入:

@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 值。测试期间将忽略注释。

【讨论】:

    【解决方案2】:

    没有内置的方法可以做到这一点,请注意@InjectMocks has its downsides as well: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;
      }
    
      // ....
    }
    

    【讨论】:

      猜你喜欢
      • 2016-10-17
      • 1970-01-01
      • 1970-01-01
      • 2018-11-05
      • 1970-01-01
      • 2016-12-07
      • 2018-06-26
      • 1970-01-01
      • 2011-10-12
      相关资源
      最近更新 更多