Springs @Autowiring功能以及Mocking

时间:2015-12-08 11:12:02

标签: spring spring-mvc mockito junit4

问题: 我有一个A级

class A {

      @Autowired
      EdocumentDAO eDocumentDAO;

      public void createDocument(DocumentType docType)
      {
            String DocID= saveIndocRepo();//To be Mocked
            docType.setID(DocID);

            isSaved = eDocumentDAO.save()//Autowired

      }
      private String saveIndocRepo()
      {
          //Code to save in Repo in another platform and return the DOC_ID
      }


}

我的A_Test课程

@ContextConfiguration({ "classpath:test-beans.xml" })
@RunWith(SpringJUnit4ClassRunner.class)
@ActiveProfiles("test")
class A_test {

        A a = Mockito.spy(new A());

        Mockito.doReturn("DOC_ID").when(a).saveIndocRepo();
        a.createDocument(docType);      
}

要求: 我有方法saveIndocRepo(),它与外部服务交互并将文档保存在他们的仓库中。所以这需要被嘲笑。

createDocument()中调用,并且应该返回模拟值。收到DocID后,其他文档详细信息将保存到DB中(我为其配置了Derby内存数据库)。 EdocumentDAO用于自动装配,由弹簧实例化。

问题: 当我尝试模拟方法(saveInDocRepo)时,它的Mocked成功但自动装配失败。这导致JUnit失败。 当我删除模拟时,自动装配正在完美执行。

有什么我想念的吗?或者我的方法不正确。 专家 - 请告知适当的解决方案。

3 个答案:

答案 0 :(得分:0)

你必须模拟一个接口,而不是类本身。 使用Class to Mock的公共方法创建一个接口。

在上面的示例中,您正在监视A,但A取决于EdocumentDAO。你也必须模拟这个课程。

@Mock
EdocumentDAO edocumentDAOMock;

或者,我最喜欢Spring的方式,因为你可以实现模拟行为:

@Bean
private EdocumentDAO getEdocumentDAOMock() {
    return mock(EdocumentDAO.class);
}

此外,由于您使用的是Spring,因此无法使用new A(),您必须使用Spring来实例化Bean,否则自动连接的注释将无法正常工作。

答案 1 :(得分:0)

你可以使用mockito的速记注入而不依赖于Spring:

 var carFormats = this.carRepository.All()
                .Where(x => x.CarFormat.Any(c => c.Car.Id == someVar.CarId))
                .Select(x=>x.CarFormat).AsEnumerable();

注意这是伪代码,因为我现在不能使用IDE

答案 2 :(得分:0)

谢谢大家,为你提供帮助。

解决方案:

@ContextConfiguration({ "classpath:test-beans.xml" })
@RunWith(SpringJUnit4ClassRunner.class)
@ActiveProfiles("test")

@Spy
@InjectMocks
A a = new A();

@Autowired
@Spy
EdocumentDAO eDocumentDAO;
class A_test {

        Mockito.doReturn("DOC_ID").when(a).saveIndocRepo();
        a.createDocument(docType);      
}

现在,当调用createDocument()方法时,saveInDocRepo()被模拟为返回" DOC_ID"并且eDocumentDAO.save()完美运行。 它的@Spy用于部分嘲笑,挽救了这一天。