我有以下想要测试的类:
@Component
public class ToBeTested {
@Autowired
private HelperA helperA;
@Autowired
private HelperB helperB;
... //10 other such helpers
}
我只想模拟助手A类。如何在 jUnit 中执行此操作?我不想嘲笑其他辅助类。我也不想为所有帮助程序编写@Spy和@Resource并在测试用例中使用@InjectMocks。
有没有办法让我只将助手 A 的模拟注入到测试用例中的 ToBeTested 类中?
总而言之,你想使用一个模拟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嘲笑。
如果你只需要 helperB,那么你需要 @InjectMocks
.
@RunWith(MockitoJUnitRunner.class)
public class MyTest() {
@InjectMocks
public ToBeTested toBeTested;
@Mock
private HelperB helperB;
...your tests go here
}
当然,这会让你的帮手null
。如果你想同时拥有两者,你只需要一个 Spring 配置来测试,将 helperB 设置为模拟 bean(通过工厂方法),然后用 SpringJUnit4ClassRunner
运行整个事情。