Service test succeeds in VSCode IDE but fails using Mvn install with classnotfoundException on DAO

18 Views Asked by At

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

0

There are 0 best solutions below