【发布时间】:2013-04-07 10:38:21
【问题描述】:
假设一个遗留应用程序有 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);
}
}
【问题讨论】:
-
我不明白为什么你会有
mock1和mock2在你的测试中似乎不相关,因为它们无关紧要。加上似乎没有使用助手,在测试中得到验证。如果一切都由弹簧连接,你为什么要它。我相信您实际上应该模拟紧密耦合的助手,并验证交互。此外,最终您可以将此测试编写为大型功能/特性测试,即不是单元测试也不是集成测试,因此它将被放置在其他一些包中以显示您的同事的差异。 -
顺便问一下,您是否尝试过 spring 3 中可用的注释配置?如果您只需要注入一些依赖项,它可能会很有用,并且这也适用于模拟(不需要 springockito,如果添加另一个 maven 依赖项是一个问题)。
标签: spring junit mockito springmockito