Java 用于void delete方法的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

我是JUnit的新手,正在努力学习。如何为void方法编写JUnit。 我有一个删除方法是无效的。我写的测试如下,但它不工作。 请建议

我必须为其编写测试用例的方法

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));
    }
}