问题: 我有一个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失败。 当我删除模拟时,自动装配正在完美执行。
有什么我想念的吗?或者我的方法不正确。 专家 - 请告知适当的解决方案。
答案 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用于部分嘲笑,挽救了这一天。