Spring 使用@Mock和@injectmock的配置
我想在spring应用程序中使用模拟DAO对服务层进行单元测试。在DAO中,可以看到工厂是使用@Inject注入的 当测试类配置为@RunWith(MockitoJUnitRunner.class)时 输出与预期一样 当我将配置更改为使用@RunWith(SpringJUnit4ClassRunner.class)时 如果ServiceTest-context.xml中找不到SessionFactory bean,则会抛出异常“找不到依赖项类型为[org.hibernate.SessionFactory]的合格bean”Spring 使用@Mock和@injectmock的配置,spring,unit-testing,mockito,spring-test,Spring,Unit Testing,Mockito,Spring Test,我想在spring应用程序中使用模拟DAO对服务层进行单元测试。在DAO中,可以看到工厂是使用@Inject注入的 当测试类配置为@RunWith(MockitoJUnitRunner.class)时 输出与预期一样 当我将配置更改为使用@RunWith(SpringJUnit4ClassRunner.class)时 如果ServiceTest-context.xml中找不到SessionFactory bean,则会抛出异常“找不到依赖项类型为[org.hibernate.SessionFac
我不明白的是MyDao已经用@Mock注释了,为什么仍然需要sessionFactory?您必须使用
@RunWith(MockitoJUnitRunner.class)
初始化这些Mock并注入它们
@Mock
创建一个Mock李>
@InjectMocks
创建类的实例,并将使用@Mock
或@Spy
注释创建的Mock注入该实例Mockito.initMocks(this)
如下:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("test-app-ctx.xml")
public class FooTest {
@Autowired
@InjectMocks
TestTarget sut;
@Mock
Foo mockFoo;
@Before
/* Initialized mocks */
public void setup() {
MockitoAnnotations.initMocks(this);
}
@Test
public void someTest() {
// ....
}
}
必须使用
@RunWith(MockitoJUnitRunner.class)
初始化这些mock并注入它们
@Mock
创建一个Mock李>
@InjectMocks
创建类的实例,并将使用@Mock
或@Spy
注释创建的Mock注入该实例Mockito.initMocks(this)
如下:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("test-app-ctx.xml")
public class FooTest {
@Autowired
@InjectMocks
TestTarget sut;
@Mock
Foo mockFoo;
@Before
/* Initialized mocks */
public void setup() {
MockitoAnnotations.initMocks(this);
}
@Test
public void someTest() {
// ....
}
}
请记住,Spring runner执行的初始化发生在调用
initMocks
之前。因此Spring runner不会看到MyDao
实际上是一个模拟的,它还没有被实例化;Spring不理解@Mock
注释,所以它不知道这里会有一个Mock。“这有意义吗?”大卫,谢谢你的回答。在我删除注释@RunWith
和@ContextConfiguration
之后,它就按预期工作了。请记住,Spring runner执行的初始化发生在调用initMocks
之前。因此Spring runner不会看到MyDao
实际上是一个模拟的,它还没有被实例化;Spring不理解@Mock
注释,所以它不知道这里会有一个Mock。“这有意义吗?”大卫,谢谢你的回答。在我删除注释@RunWith
和@ContextConfiguration
之后,它就如预期的那样工作了。这个问题已经有一段时间了,但是你的答案对其他人会有帮助,谢谢。这个问题已经有一段时间了,但是你的答案对其他人会有帮助,谢谢。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("test-app-ctx.xml")
public class FooTest {
@Autowired
@InjectMocks
TestTarget sut;
@Mock
Foo mockFoo;
@Before
/* Initialized mocks */
public void setup() {
MockitoAnnotations.initMocks(this);
}
@Test
public void someTest() {
// ....
}
}