使用@Mock和@InjectMocks的配置



我想使用一个mock DAO来对我的spring应用程序中的服务层进行单元测试。在DAO中,seesinoFactory是使用@Inject注入的。

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

@RunWith(MockitoJUnitRunner.class)
public class ServiceTest {
    @Mock
    private MyDao myDaoMock;
    @InjectMocks
    private MyServiceImpl myService;
}

输出与预期一样。

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

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "/ServiceTest-context.xml")
public class ServiceTest {
    @Mock
    private MyDao myDaoMock;
    @InjectMocks
    private MyServiceImpl myService;
    @Before
    public void setup(){
        MockitoAnnotations.initMocks(this);
    }
}

如果SessionFactory bean在ServiceTest-context.xml中不可用,则将抛出异常"未找到符合依赖关系的类型为[org.hibernate.SessionFactory]的bean"。

我不明白的是,MyDao已经用@Mock注释了,为什么还需要sessionFactory?

您必须使用@RunWith(MockitoJUnitRunner.class)来初始化这些mock并注入它们。

  1. @Mock创建一个mock
  2. @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() {
         // ....
    }
}

相关内容

  • 没有找到相关文章

最新更新