如何模拟正在测试的类的某些对象?

时间:2016-01-28 07:39:09

标签: java spring junit mockito

我想要测试下面的课程:

@Component
public class ToBeTested {
 @Autowired
 private HelperA helperA;

 @Autowired
 private HelperB helperB;

 ... //10 other such helpers
}

我想模仿HelperA课程。我如何在jUnit中执行此操作?我不想嘲笑其他助手类。我也不想写@Spy& @Resource用于所有帮助程序,并在测试用例中使用@InjectMocks。

我是否有办法在测试用例中只将HelperA的模拟注入到ToBeTested类中?

2 个答案:

答案 0 :(得分:1)

总结一下,您想要使用模拟HelperA而使用@Autowired HelperB

我写了一篇关于此的文章可以提供帮助:http://www.sleepeasysoftware.com/how-to-mock-out-a-deeply-nested-class-in-spring-without-going-insane/

总结一下,把它放在测试类的顶部:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = ASubclassOfYourRealConfig.class)

然后你创建ASubclassOfYourRealConfig看起来像这样:

public class ASubclassOfYourRealConfig extends YourRealConfig {


   @Bean
   public HelperA getHelperA() {
       return mock(HelperA.class);
   }

}

在您的测试课程中,@Autowire HelperA可以像平常一样,但在该测试中实际上会被Mockito嘲笑。

答案 1 :(得分:0)

如果您只想要helperB,那么您需要@InjectMocks

@RunWith(MockitoJUnitRunner.class)
public class MyTest() {

@InjectMocks
public ToBeTested toBeTested;

@Mock 
private HelperB helperB;

...your tests go here

}

当然,这将离开你的助手A null。如果你想要两者兼而有之,你只需要为你的测试配置一个Spring配置,将helperB设置为一个模拟bean(通过工厂方法)并使用SpringJUnit4ClassRunner运行整个事件)