Java 重复记录数据库异常的JUnit测试
我需要测试我的数据库,当我在有约束的特定列中插入重复值时,它会触发异常。你能告诉我如何模拟第二次相同的呼叫和火灾异常吗 这是我的代码,但不起作用:Java 重复记录数据库异常的JUnit测试,java,spring,junit,mockito,Java,Spring,Junit,Mockito,我需要测试我的数据库,当我在有约束的特定列中插入重复值时,它会触发异常。你能告诉我如何模拟第二次相同的呼叫和火灾异常吗 这是我的代码,但不起作用: @RunWith(MockitoJUnitRunner.class) public class SomeTestClass { @InjectMocks private FooService service = new FooServiceImpl(); @Test(expected = DataIntegrityViol
@RunWith(MockitoJUnitRunner.class)
public class SomeTestClass {
@InjectMocks
private FooService service = new FooServiceImpl();
@Test(expected = DataIntegrityViolationException.class)
public void myTest() {
// init Foo object here
service.createFoo(myFoo); // here should pass
service.createFoo(myFoo); // here shouldn't
}
}
我无法显示原始的FooServiceImpl,但基本概念如下:
@Transactional
public void createFoo(Foo foo) {
MainFoo mainFoo = new MainFoo();
SomeObj obj1 = objService.findOne(foo.getId());
mainFoo.setObj(obj1);
fooRepository.save(mainFoo);
}
我做错了什么?谢谢。我不确定您是想测试实际的数据库还是只需要模拟DB调用。如果您只是想测试服务类,最好使用模拟第二条语句
doThrow(ExpectedException).when(mockedObject).methodReturningVoid(...);
另外,如果您使用的是spring,那么只需使用@injectmock
并使用@mock
模拟受尊重类的依赖项
对于连续呼叫,您可以使用:
Mockito.when(repo.findOne(Matchers.anyString())).thenReturn(yourObject).thenThrow(EXCEPTION_OBJ)
我需要测试我的数据库,当我在
我有约束的特定列,它会引发异常
要执行一个断言来检查数据库约束是否存在并执行其工作,您应该使用内存中的数据库执行一个没有模拟的测试
H2数据库在这方面很好。在调用该方法之前,在内存数据库中添加Foo实体的记录。您可以使用EntityManager或您的服务来实现这一点。 然后调用您的方法 您的测试应该是什么样子的示例:
@RunWith(SpringJUnit4ClassRunner.class)
public class SomeTestClass {
private FooService service = new FooServiceImpl();
@Autowired
private EntityManager em;
@Test(expected = DataIntegrityViolationException.class)
public void myTest() {
Foo fooWithXxxValueInBarColumn= new ...();
em.persist(fooWithXxxValueInBarColumn);
Foo newFooWithSameXxxValueInBarColumn = new ...();
service.createFoo(newFooWithSameXxxValueInBarColumn);
}
}
当然,您必须将测试上下文配置为使用内存中的数据库,而不是真正的数据库。您应该展示FooService实现。请注意,您在这里并没有模拟任何内容。@davidxxx我编辑了这个问题。我测试了在我的服务中将有来自数据库的FireException,因为在表中,我对一列有唯一的约束。所以,当我第一次用某个对象调用服务时,它通过了,但第二次将抛出错误。但我如何在mock中用相同的参数模拟第二次调用呢?您是如何真正执行测试用例的?您的应用程序中是否有嵌入式服务器?任何testNg框架?我编辑了我的答案。因此调用应该返回到一个对象中,随后的调用将导致一个异常。事实上,如果他想测试一个依赖于异常的行为,这是有意义的。但是,当他想断言单元测试中抛出了
DataIntegrityViolationException
时,我想知道单元测试与Mockito的相关性。