1

我想使用模拟 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);
    }
}

如果 ServiceTest-context.xml 中的 sessionFactory bean 不可用,则将抛出异常“没有为依赖项找到类型为 [org.hibernate.SessionFactory] ​​的合格 bean”。

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

4

1 回答 1

1

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

  1. @Mock创建一个模拟。
  2. @InjectMocks创建该类的一个实例,并将使用@Mockor@Spy注释创建的模拟注入到该实例中。

或使用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() {
         // ....
    }
}
于 2020-01-06T13:17:44.960 回答