JUnit для метода void delete - PullRequest
       8

JUnit для метода void delete

0 голосов
/ 12 декабря 2018

Я новичок в JUnit и пытаюсь учиться.Как мы можем написать 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;
}

Заранее спасибо

Обновлено

java.lang.NullPointerException
at verify(doseRepository).deleteById(arg.capture().getDoseId());
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at 
java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:74)
at org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:84)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:89)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:541)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:763)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:463)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:209)

Ответы [ 3 ]

0 голосов
/ 12 декабря 2018

В смоделированном действии вам нужно захватить аргумент.И тогда вы можете утверждать все, что хотите, основываясь на захваченном аргументе.

Может быть, что-то вроде этого?

verify(doseRepository).deleteById(arg.capture());
assertEquals(dose.getDoseId(), arg.getValue().getDoseId());
0 голосов
/ 12 декабря 2018

Модульный тест должен проверять ТОЛЬКО класс, для которого он написан.Поэтому не нужно вводить реальный объект, только издевается.Также вам не нужен объект Dose, так как единственное, что вам нужно, это протестировать объект 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));
    }
}
0 голосов
/ 12 декабря 2018

Это потому, что вы проверяете метод delete, но в своем коде вы используете метод deleteById.

Этот код должен работать:

verify(doseRepository).deleteById(arg.capture()); // changed to deleteById
assertEquals(dose, arg.capture());
...