Spring 使用@Mock和@injectmock的配置

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

我想在spring应用程序中使用模拟DAO对服务层进行单元测试。在DAO中,可以看到工厂是使用@Inject注入的

当测试类配置为@RunWith(MockitoJUnitRunner.class)时

输出与预期一样

当我将配置更改为使用@RunWith(SpringJUnit4ClassRunner.class)时

如果ServiceTest-context.xml中找不到SessionFactory bean,则会抛出异常“找不到依赖项类型为[org.hibernate.SessionFactory]的合格bean”


我不明白的是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() {
             // ....
        }
    }