【发布时间】:2014-02-03 03:34:30
【问题描述】:
我的单元测试中有任何问题,我有类似的东西。如果blargh 函数使用 Transactional 注释,则模拟注入会在 someService 上被覆盖。如果我删除 Transactional ,则模拟会留在那里。从代码中可以看出,当服务中的函数被注释为事务时,Spring 会延迟加载服务,但在没有注释时会急切地加载服务。这会覆盖我注入的模拟。
有没有更好的方法来做到这一点?
@Component
public class SomeTests
{
@Autowired
private SomeService someService;
@Test
@Transactional
public void test(){
FooBar fooBarMock = mock(FooBar.class);
ReflectionTestUtils.setField(someService, "fooBar", fooBarMock);
}
}
@Service
public class someService
{
@Autowired FooBar foobar;
@Transactional // <-- this causes the mocked item to be overridden
public void blargh()
{
fooBar.doStuff();
}
}
【问题讨论】:
-
你能生成代码(和配置)来重现这个吗?
-
根据您的问题,我假设您没有单元测试,而是使用 Spring 上下文和一些模拟的 bean 进行集成测试。你如何将 FooBar 类的模拟注入到 Spring 上下文中?您使用 Springockito 还是尝试手动操作?提供测试课程,以增加您获得准确帮助的机会。
-
你最后是怎么解决这个问题的?
-
我最终重构了我的代码以分离出概念,以便在这种情况下更容易测试。
标签: java spring unit-testing mockito