Java 用于void delete方法的JUnit
我是JUnit的新手,正在努力学习。如何为void方法编写JUnit。 我有一个删除方法是无效的。我写的测试如下,但它不工作。 请建议 我必须为其编写测试用例的方法Java 用于void delete方法的JUnit,java,spring-boot,junit,mockito,Java,Spring Boot,Junit,Mockito,我是JUnit的新手,正在努力学习。如何为void方法编写JUnit。 我有一个删除方法是无效的。我写的测试如下,但它不工作。 请建议 我必须为其编写测试用例的方法 public class DoseService { @Autowired private DoseRepository doseRepo; public void deleteDose(int id) { doseRepo.deleteById(id); } } 我的测试 @Autowired priva
public class DoseService {
@Autowired
private DoseRepository doseRepo;
public void deleteDose(int id) {
doseRepo.deleteById(id);
}
}
我的测试
@Autowired
private DoseService doseService;
@MockBean
public DoseRepository doseRepository;
@Test
public void testDeleteDose() {
Dose dose = createDose();
ArgumentCaptor<Dose> arg = ArgumentCaptor.forClass(Dose.class);
doseService.deleteDose(dose.getDoseId());
verify(doseRepository).deleteById(arg.capture().getDoseId());
assertEquals("120", arg.getValue().getDoseValue());
}
private Dose createDose() {
Dose dose = new Dose();
dose.setDoseId(1);
dose.setDoseValue("120");
return dose;
}
这是因为您正在验证
delete
方法,但在您的代码中,您正在使用deleteById
方法
此代码应适用于:
verify(doseRepository).deleteById(arg.capture()); // changed to deleteById
assertEquals(dose, arg.capture());
在模拟操作中,您需要捕获参数。然后,您可以根据捕获的参数断言任何您想要的内容 也许是这样的
verify(doseRepository).deleteById(arg.capture());
assertEquals(dose.getDoseId(), arg.getValue().getDoseId());
单元测试应该只测试为其编写的类。所以不需要注入真实对象,只需模拟。此外,您不需要剂量对象,因为您唯一需要的是测试DoseService对象 我会这样做:
@ExtendWith(MockitoExtension.class)//for JUnit 5, but you can add the JUnit 4 annotation
public class DoseServiceTest {
@Mock
private DoseRepository doseRepository;
@InjectMocks
private DoseService sut;//System Under Test
@Test
public void testDeleteDose() {
int doseId=42;
// perform the call
sut.deleteDose(doseId);
// verify the mocks
verify(doseRepository, times(1)).deleteById(eq(doseId));
}
}
“不起作用”。那是什么意思?你说的“不工作”是什么意思?断言错误?我已更新运行测试时获得的异常。请在更新的部分中找到,没有发布异常,也没有更新的部分。@ErikPragt它现在已添加。我之前放置了错误的测试用例。我改了。我还是得到了例外别担心,但是你还没有解释你得到了什么样的错误我已经添加了例外。请看一看。是的,我错了。正确的代码将如您所建议的那样。在我做了修改之后。现在我在同一行中得到了NullPointerException。好吧,你的更新严格来说是不一样的。但无论如何,检查斯文的答案,他为你展示了实现目标的正确方法。谢谢。它很好用。这样我们就可以测试void方法了。如果我们有一个自定义的save方法,它是空的,并且存在于扩展了crudepository的dao(Repository interface)中。在这种情况下,我们如何验证这一点?只需单独测试每个类。所以把每一类都隔离起来。它应该在不触发它所依赖的类的情况下进行测试。使用依赖项注入可以隔离所有类,这是一种很好的方法。尝试验证对每个模拟依赖项的每个调用。使用捕获器获取传递给模拟的参数。
@ExtendWith(MockitoExtension.class)//for JUnit 5, but you can add the JUnit 4 annotation
public class DoseServiceTest {
@Mock
private DoseRepository doseRepository;
@InjectMocks
private DoseService sut;//System Under Test
@Test
public void testDeleteDose() {
int doseId=42;
// perform the call
sut.deleteDose(doseId);
// verify the mocks
verify(doseRepository, times(1)).deleteById(eq(doseId));
}
}