给定一个遗留应用程序有 1500 个 spring.xmls。我想为服务编写单元测试。我深陷依赖地狱。我必须按原样接受该应用程序,没有出路。
所以我们使用 spring-3.something 和 mockito-1.9,我想要测试服务的好方法。较新的代码大量使用@Autowired 注解。
间接地,该服务使用了我实际想要在测试中使用的 ~25 个助手(工厂方法等),以及 ~25 个我对此测试不感兴趣的对象。
我目前尝试以上述方式设置上下文,但我对@Mock、@InjectMocks、@Autowired 的影响感到困惑。
我的测试如下。我需要帮助才能正确设置。
问题:
- @InjectMocks 的实际效果是什么?
- 我如何才能决定(技术上)真正使用哪些自动装配的 bean,哪些被模拟替换?
- 我知道,我在滥用模拟来获取假货。有没有一种更简单的方法可以在单线中获取假货?
- *请注意,我想了解这一点,因为我有大量此类服务... *
这是我的示例:
@ContextConfiguration(locations = {
"classpath:/some/path/MainTestConfig.spring.xml"
})
@RunWith(SpringJUnit4ClassRunner.class)
public class SampleTest {
// *** Uninteresting Dependencies to be mocked *** //
@Mock Mock1 mock1;
@Mock Mock2 mock2;
/** Service under test */
@Autowired
SomeService service;
// *** Tightly coupled helpers to be used *** //
@Autowired Helper1 helper1
@Autowired Helper2 helpr2
@Before
public void setup() {
MockitoAnnotations.initMocks(SampleTest.class);
}
@Test
public void testSample() {
// prepare dummy context
SomeContext context = new Context();
// define expected result
int expectedValue = 42;
//execute method under test, record result
Result actualResult = service.execute(context);
//make assertions on result
assertTrue(actualResult.getSomething()==expectedValue);
}
}