Mocking liquibase when testing a RestController: Spring + JPA + Junit Jupiter + liquibase

Viewed 269

I'm having trouble integrating a bunch of technologies together. I've got a project that uses junit jupiter and I need to test one of my @RestController's. The issue I'm having is that liquibase keeps trying to connect to the database (which I want to mock so that no connection to anything is attempted). I also need to make it so that the @Repository is mocked (mockito is working well so far). I also need to be able to get all the tests to run with mvn test. I tried just turning liquibase off (spring.liquibase.enabled=false) however now it fails to create JDBCEnvironment service.

pom.xml


<properties>
        <java.version>11</java.version>
        <swagger.version>2.9.2</swagger.version>
        <dockerfile-maven-version>1.4.12</dockerfile-maven-version>
        <immutables.version>2.8.0</immutables.version>
        <maven.checkstyle.version>3.1.0</maven.checkstyle.version>
        <maven.info.report.version>2.7</maven.info.report.version>
        <sleuth.version>2.1.6.RELEASE</sleuth.version>
        <logstash.version>6.2</logstash.version>
        <logback.contrib.version>0.1.5</logback.contrib.version>
        <spring-cloud.version>Hoxton.SR4</spring-cloud.version>
        <avro.version>1.9.2</avro.version>
        <junit-jupiter.version>5.5.0</junit-jupiter.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <!-- Sleuth automatically adds trace interceptors when in the classpath -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-sleuth</artifactId>
                <version>${sleuth.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>net.logstash.logback</groupId>
                <artifactId>logstash-logback-encoder</artifactId>
                <version>${logstash.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <!--        FOR EMBEDDED DB TESTS     -->
        <dependency>
            <groupId>com.opentable.components</groupId>
            <artifactId>otj-pg-embedded</artifactId>
            <version>0.13.3</version>
            <scope>test</scope>
        </dependency>
        <!--        FOR EMBEDDED DB TESTS     -->
        <!--        FOR TRUSTING SELF SIGNED CERTS      -->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.6</version>
        </dependency>
        <!--        FOR TRUSTING SELF SIGNED CERTS      -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-sleuth</artifactId>
        </dependency>
        <dependency>
            <groupId>net.logstash.logback</groupId>
            <artifactId>logstash-logback-encoder</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.retry</groupId>
            <artifactId>spring-retry</artifactId>
            <version>1.1.2.RELEASE</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.liquibase/liquibase-core -->
        <dependency>
            <groupId>org.liquibase</groupId>
            <artifactId>liquibase-core</artifactId>
            <version>3.8.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>com.vaadin.external.google</groupId>
                    <artifactId>android-json</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.avro</groupId>
            <artifactId>avro</artifactId>
            <version>${avro.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.kafka</groupId>
            <artifactId>spring-kafka</artifactId>
        </dependency>
        <dependency>
            <groupId>org.yaml</groupId>
            <artifactId>snakeyaml</artifactId>
            <version>1.24</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>${swagger.version}</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>${swagger.version}</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-json-org</artifactId>
            <!-- <version>2.9.7</version> -->
            <exclusions>
                <exclusion>
                    <groupId>org.json</groupId>
                    <artifactId>json</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20190722</version>
        </dependency>
        <dependency>
            <groupId>org.immutables</groupId>
            <artifactId>value</artifactId>
            <version>${immutables.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>${junit-jupiter.version}</version>
            <scope>test</scope>
        </dependency>
        <!-- JSON LOGBACK CONFIG -START -->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version>
        </dependency>
        <!-- ch.qos.logback.contrib.jackson.JacksonJsonFormatter -->
        <dependency>
            <groupId>ch.qos.logback.contrib</groupId>
            <artifactId>logback-jackson</artifactId>
            <version>${logback.contrib.version}</version>
        </dependency>
        <!-- ch.qos.logback.contrib.json.classic.JsonLayout -->
        <dependency>
            <groupId>ch.qos.logback.contrib</groupId>
            <artifactId>logback-json-classic</artifactId>
            <version>${logback.contrib.version}</version>
        </dependency>
        <!-- JSON LOGBACK CONFIG -END -->
    </dependencies>

    <reporting>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-checkstyle-plugin</artifactId>
                <version>${maven.checkstyle.version}</version>
                <configuration>
                    <configLocation>google_checks.xml</configLocation>
                </configuration>
                <reportSets>
                    <reportSet>
                        <reports>
                            <report>checkstyle</report>
                        </reports>
                    </reportSet>
                </reportSets>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-project-info-reports-plugin</artifactId>
                <version>${maven.info.report.version}</version>
                <configuration>
                    <dependencyLocationsEnabled>false</dependencyLocationsEnabled>
                </configuration>
            </plugin>
        </plugins>
    </reporting>

    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <mainClass>com.employbridge.goldengate.orchestration.Orchestration</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>build-info</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <groupId>org.apache.avro</groupId>
                <artifactId>avro-maven-plugin</artifactId>
                <version>${avro.version}</version>
                <executions>
                    <execution>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>schema</goal>
                        </goals>
                        <configuration>
                            <sourceDirectory>${project.basedir}/src/main/resources/avro</sourceDirectory>
                            <outputDirectory>${project.build.directory}/</outputDirectory>
                            <imports>
                                <import>${project.basedir}/src/main/resources/avro/Bridge.avsc</import>
                            </imports>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>3.0.0-M5</version>
            </plugin>
        </plugins>
    </build>

And my tests look something like this...

@SpringBootTest
@AutoConfigureMockMvc
@ActiveProfiles("test")
public class BridgeConfigurationControllerTest {

    @Autowired
    MockMvc mockMvc;

    @Mock
    BridgeConfigService bridgeConfigService;

    @Mock
    private AccountNumberService accountNumberService;

    @Test
    public void saveBridgeConfigShouldReturnOkOnGoodPayLoad() throws Exception {
        BridgeConfigurations bridgeConfigurations = mockPayLoad("dbWrite");


        GenericResponse bridgeConfigByNameResponse = GenericResponse.createErrorResponse("");
        when(bridgeConfigService.findBridgeConfigByNameExactMatchIgnoreCase(any())).thenReturn(bridgeConfigByNameResponse);


        List<String> allAccountNumbersList = bridgeConfigurations.getAccountNumbers().stream().map(Object::toString).collect(Collectors.toList());
        when(accountNumberService.getValidAccountNumbers(any())).thenReturn(allAccountNumbersList);

        GenericResponse genericResponse = GenericResponse.createSuccessResponse();
        genericResponse.setResponse(mockPayLoad("dbWrite"));
        when(bridgeConfigService.save(any(BridgeConfigurations.class))).thenReturn(genericResponse);
        
        mockMvc.perform(post("/api/bridgeconfig/")
                .contentType(MediaType.APPLICATION_JSON)
                .content(mockPayLoad("good").toString()))
                .andExpect(status().isOk());
    }
0 Answers
Related