我需要测试我的数据库,当我在具有约束的特定列中插入重复值时,它会触发异常。你能告诉我如何模拟第二次同一个电话和火警异常吗?
这是我的代码,但不起作用:
@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);
}
我做错了什么?感谢。
答案 0 :(得分:1)
当我插入重复值时,我需要测试我的数据库 我有约束的特定列,它会触发异常。
要执行检查数据库约束是否存在并执行其工作的断言,您应该在不使用mock和内存数据库的情况下执行测试。
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);
}
}
当然,您必须配置测试上下文以使用内存数据库而不是真实数据库。
答案 1 :(得分:0)
我不确定您是否要测试您的实际数据库,或者您只需要模拟数据库调用。如果您只是想测试您的服务类,请更好地模拟第二个语句。
doThrow(ExpectedException).when(mockedObject).methodReturningVoid(...);
此外,如果您使用的是Spring,那么您需要做的只是使用@InjectMocks
并使用@Mock
模拟受尊重类的依赖关系。
对于连续通话,您可以使用:
Mockito.when(repo.findOne(Matchers.anyString())).thenReturn(yourObject).thenThrow(EXCEPTION_OBJ)