Why are null's fields returned in the test?
JUnit version is 5. I tried to saddle through the fourth, but the error is the same. If done through @RunWith (SpringRunner.class) – the check does not stop at all. Also I tried to do it through @MockBean – and that didn’t help. Service in normal mode works fine. Thanks.
Dependencies in pom.xml:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.shell</groupId> <artifactId>spring-shell-starter</artifactId> <version>2.0.1.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.2</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <scope>test</scope> </dependency> </dependencies>
Repository:
@Repository public interface ClientRepository extends PagingAndSortingRepository<Client, UUID> { }
Service and TestService:
@ShellComponent @SuppressWarnings("Duplicates") public class ClientService { private final ClientRepository clientRepository; @Autowired public ClientService(ClientRepository clientRepository) { this.clientRepository = clientRepository; } @ShellMethod("Shows all clients in db") @Transactional public Iterable<ClientDTO> showAllClients() { return StreamSupport.stream(clientRepository.findAll().spliterator(), false).map(client -> { ClientDTO clientDTO = new ClientDTO(); clientDTO.setId(client.getId()); clientDTO.setName(client.getName()); clientDTO.setTotalDebt(client.getDebts().stream() .map(Debt::getValue) .reduce(BigDecimal::add) .orElse(BigDecimal.ZERO) .subtract(client.getPayments().stream() .map(Payment::getValue) .reduce(BigDecimal::add) .orElse(BigDecimal.ZERO))); return clientDTO; }).collect(Collectors.toList()); } @ShellMethod("Adds client to db") @Transactional public UUID addClient(@ShellOption String name) { Client client = new Client(); client.setId(UUID.randomUUID()); client.setName(name); client = clientRepository.save(client); return client.getId(); } @ShellMethod("Adds debt to client") @Transactional public UUID addDebtToClient(@ShellOption UUID clientId, @ShellOption BigDecimal value) { Client client = clientRepository.findById(clientId).orElseThrow(RuntimeException::new); Debt debt = new Debt(); debt.setId(UUID.randomUUID()); debt.setValue(value); debt.setClient(client); client.getDebts().add(debt); clientRepository.save(client); return debt.getId(); } @ShellMethod("Adds payment to client") @Transactional public UUID addPaymentToClient(@ShellOption UUID clientId, @ShellOption BigDecimal value) { Client client = clientRepository.findById(clientId).orElseThrow(RuntimeException::new); Payment payment = new Payment(); payment.setId(UUID.randomUUID()); payment.setValue(value); payment.setClient(client); client.getPayments().add(payment); clientRepository.save(client); return payment.getId(); } }
The ClientService and ClientRepository fields return null values:
@ExtendWith(SpringExtension.class) @SpringBootTest public class ClientServiceTest { @Autowired private ClientService clientService; @Autowired private ClientRepository clientRepository; @Test public void addClient() { UUID clientId = clientService.addClient("Сергей"); Optional<Client> client = clientRepository.findById(clientId); Assert.assertNotNull(client.get()); Assert.assertEquals(clientId, client.get().getId()); } @Test public void addDebtToClient() { UUID clientId = clientService.addClient("Сергей"); UUID debtId = clientService.addDebtToClient(clientId, new BigDecimal(1000)); Optional<Client> clientFromDB = clientRepository.findById(clientId); Optional<Debt> debt = clientFromDB.get().getDebts().stream() .filter(d -> d.getId() == debtId) .findFirst(); Assert.assertEquals(debtId, debt.get().getId()); Assert.assertEquals(new BigDecimal(1000), debt.get().getValue()); Assert.assertEquals(clientId, debt.get().getClient().getId()); } @Test public void addPaymentToClient() { UUID clientId = clientService.addClient("Сергей"); UUID paymentId = clientService.addPaymentToClient(clientId, new BigDecimal(1000)); Optional<Client> clientFromDB = clientRepository.findById(clientId); Optional<Payment> payment = clientFromDB.get().getPayments().stream() .filter(p -> p.getId() == paymentId) .findFirst(); Assert.assertEquals(paymentId, payment.get().getId()); Assert.assertEquals(new BigDecimal(1000), payment.get().getValue()); Assert.assertEquals(clientId, payment.get().getClient().getId()); } }
Errors:
java.lang.NullPointerException at com.cometrica.javajuniortask.service.ClientServiceTest.addClient(ClientServiceTest.java:32) 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:59) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306) at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63) at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329) at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293) at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306) at org.junit.runners.ParentRunner.run(ParentRunner.java:413) at org.junit.runner.JUnitCore.run(JUnitCore.java:137) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68) at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47) at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242) at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70) java.lang.NullPointerException at com.cometrica.javajuniortask.service.ClientServiceTest.addPaymentToClient(ClientServiceTest.java:55) 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:59) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306) at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63) at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329) at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293) at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306) at org.junit.runners.ParentRunner.run(ParentRunner.java:413) at org.junit.runner.JUnitCore.run(JUnitCore.java:137) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68) at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47) at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242) at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70) java.lang.NullPointerException at com.cometrica.javajuniortask.service.ClientServiceTest.addDebtToClient(ClientServiceTest.java:41) 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:59) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306) at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63) at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329) at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293) at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306) at org.junit.runners.ParentRunner.run(ParentRunner.java:413) at org.junit.runner.JUnitCore.run(JUnitCore.java:137) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68) at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47) at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242) at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)