The following service test fails as it cannot find the DAO using Springboot3
When the test is executed using MVN install it fails but succeeds with executing using VSCode/Run test via IDE.
Since VSCode executes successfully I believe most components are in place however, since MVN fails perhaps I've not configured MVN but not sure what to review
This is a multimodule structure with a parent POM containing all the common dependencies whilst the child POM contains the specific dependencies. The following testing references a DAO in another maven dependency jar as shown below.
Service Pom/Dependency:
<dependencies>
<dependency>
<groupId>au.com.cs.inventory</groupId>
<artifactId>inv-data</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
Service Test Class:
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import au.com.cs.inventory.data.dao.InventoryDao;
import au.com.cs.inventory.data.model.ContainerDefinitionModel;
@ExtendWith(MockitoExtension.class)
public class InventoryServiceTest {
@InjectMocks
InventoryService inventoryService;
@Mock
private InventoryDao repository;
@Test
void get_containerDefintion() {
final Optional<ContainerDefinitionModel> existingCdf = Optional
.of(ContainerDefinitionModel.builder().build());
when(repository.findById(anyLong())).thenReturn(existingCdf);
ContainerDefinitionModel foundCdf = inventoryService.getContainerDefinition(Long.valueOf(1));
assertThat(foundCdf, equalTo(existingCdf.get()));
}
...
...
}
Error:
java.lang.NoClassDefFoundError: au/com/cs/inventory/data/dao/InventoryDao
at java.base/java.lang.Class.getDeclaredFields0(Native Method)
at java.base/java.lang.Class.privateGetDeclaredFields(Class.java:3397)
at java.base/java.lang.Class.getDeclaredFields(Class.java:2468)
at org.junit.platform.commons.util.ReflectionUtils.getDeclaredFields(ReflectionUtils.java:1473)
at org.junit.platform.commons.util.ReflectionUtils.findAllFieldsInHierarchy(ReflectionUtils.java:1202)
at org.junit.platform.commons.util.ReflectionUtils.findFields(ReflectionUtils.java:1190)
...
Caused by: java.lang.ClassNotFoundException: au.com.cs.inventory.data.dao.InventoryDao
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
... 43 more
DAO Class:
package au.com.cs.inventory.data.dao;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import au.com.cs.inventory.data.model.ContainerDefinitionModel;
@Repository
public interface InventoryDao extends JpaRepository<ContainerDefinitionModel, Long> {
}
ContainerDefintionModel(Entity):
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import lombok.AllArgsConstructor;
import lombok.Builder;
@Builder
@Entity
public class ContainerDefinitionModel {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String definitionName;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getDefinitionName() {
return definitionName;
}
public void setDefinitionName(String definitionName) {
this.definitionName = definitionName;
}
}
I'm out of ideas so any idea would be greatly appreciated.
TIA