'Cannot execute single nested test method in netbeans with junit jupiter and spring boot starter

Setup is Java 11, Spring Boot Starter Parent 2.1.3.RELEASE, JUnit Jupiter and NetBeans 12.6.

I want to be able to execute test method inside nested test class, using netbeans, using green arrow next to test method definition, with no success so far. I can execute non nested tests this way.

When trying to run a single nested test method from inside netbeans, getting following error:

Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.1:test (default-cli) on project tsbb-sfg-brewery: No tests were executed!  (Set -DfailIfNoTests=false to ignore this error.) -> [Help 1]

This is my project pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
  <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.3.RELEASE</version>
    <!--<version>2.6.3</version>-->
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>guru.springframework.brewery</groupId>
<artifactId>tsbb-sfg-brewery</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>tsbb-sfg-brewery</name>
<description>Demo project for Spring Boot</description>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>11</java.version>
    <!--<jaxb.version>2.3.0</jaxb.version>-->
    <maven.compiler.source>${java.version}</maven.compiler.source>
    <maven.compiler.target>${java.version}</maven.compiler.target>
    <!--<org.mapstruct.version>1.3.0.Final</org.mapstruct.version>-->
    <org.mapstruct.version>1.4.2.Final</org.mapstruct.version>
    <!--<org.projectlombok.version>1.18.6</org.projectlombok.version>-->
    <org.projectlombok.version>1.18.22</org.projectlombok.version>
    <argLine>--illegal-access=permit</argLine>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</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-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>${org.projectlombok.version}</version>
        <optional>true</optional>
        <!--<version>1.18.22</version>-->
    </dependency>
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <!--<version>${jaxb.version}</version>-->
        <version>2.3.1</version>
    </dependency>
    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-core</artifactId>
        <!--<version>${jaxb.version}</version>-->
        <version>3.0.2</version>
    </dependency>
    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-impl</artifactId>
        <!--<version>${jaxb.version}</version>-->
        <version>3.0.2</version>
    </dependency>
      <!--        <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct-jdk8</artifactId>
        <version>${org.mapstruct.version}</version>
      </dependency>-->

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <!--<version>5.0.1</version>-->
    </dependency>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <!--<version>5.0.1</version>-->
    </dependency>
    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-junit-jupiter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct</artifactId>
        <version>1.4.2.Final</version>
        <type>jar</type>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.0</version>
            <configuration>
                <annotationProcessorPaths>
                    <path>
                        <groupId>org.mapstruct</groupId>
                        <artifactId>mapstruct-processor</artifactId>
                        <!--<version>${org.mapstruct.version}</version>-->
                        <version>1.4.2.Final</version>
                    </path>
                    <path>
                        <groupId>org.projectlombok</groupId>
                        <artifactId>lombok</artifactId>
                        <version>${org.projectlombok.version}</version>
                    </path>
                </annotationProcessorPaths>
                <compilerArgs>
                    <compilerArg>
                        -Amapstruct.defaultComponentModel=spring
                    </compilerArg>
                </compilerArgs>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <version>0.8.7</version>
            <executions>
                <execution>
                    <goals>
                        <goal>prepare-agent</goal>
                    </goals>
                </execution>
                <execution>
                    <id>report</id>
                    <phase>prepare-package</phase>
                    <goals>
                        <goal>report</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

This is my test class:

package guru.springframework.brewery.web.controllers;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import guru.springframework.brewery.services.BeerService;
import guru.springframework.brewery.web.model.BeerDto;
import guru.springframework.brewery.web.model.BeerPagedList;
import guru.springframework.brewery.web.model.BeerStyleEnum;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.data.domain.PageRequest;
import org.springframework.http.MediaType;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;

import java.math.BigDecimal;
import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

import static org.hamcrest.Matchers.hasSize;
import static org.hamcrest.core.Is.is;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.BDDMockito.given;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;

@ExtendWith(MockitoExtension.class)
class BeerControllerCustomMvcTest {

@Mock
BeerService beerService;

@InjectMocks
BeerController beerController;

MockMvc mockMvc;

BeerDto validBeer;

@BeforeEach
void setUp() {
    validBeer = BeerDto.builder().id(UUID.randomUUID())
            .version(1)
            .beerName("Beer1")
            .beerStyle(BeerStyleEnum.PALE_ALE)
            .price(new BigDecimal("12.99"))
            .quantityOnHand(4)
            .upc(123456789012L)
            .createdDate(OffsetDateTime.now())
            .lastModifiedDate(OffsetDateTime.now())
            .build();

    mockMvc = MockMvcBuilders.standaloneSetup(beerController)
            .setMessageConverters(jackson2HttpMessageConverter()).build();
}

@Test
void testGetBeerById() throws Exception {
    DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ");

    given(beerService.findBeerById(any())).willReturn(validBeer);

   MvcResult result=  mockMvc.perform(get("/api/v1/beer/" + validBeer.getId()))
            .andExpect(status().isOk())
            .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
            .andExpect(jsonPath("$.id", is(validBeer.getId().toString())))
            .andExpect(jsonPath("$.beerName", is("Beer1")))
            .andExpect(jsonPath("$.createdDate",
                    is(dateTimeFormatter.format(validBeer.getCreatedDate()))))
           .andReturn();

    System.out.println(result.getResponse().getContentAsString());

}

@DisplayName("List Ops - ")
@Nested
public class TestListOperations {

    @Captor
    ArgumentCaptor<String> beerNameCaptor;

    @Captor
    ArgumentCaptor<BeerStyleEnum> beerStyleEnumCaptor;

    @Captor
    ArgumentCaptor<PageRequest> pageRequestCaptor;

    BeerPagedList beerPagedList;

    @BeforeEach
    void setUp() {
        List<BeerDto> beers = new ArrayList<>();
        beers.add(validBeer);
        beers.add(BeerDto.builder().id(UUID.randomUUID())
                .version(1)
                .beerName("Beer4")
                .upc(123123123122L)
                .beerStyle(BeerStyleEnum.PALE_ALE)
                .price(new BigDecimal("12.99"))
                .quantityOnHand(66)
                .createdDate(OffsetDateTime.now())
                .lastModifiedDate(OffsetDateTime.now())
                .build());

        beerPagedList = new BeerPagedList(beers, PageRequest.of(1, 1), 2L);

        given(beerService.listBeers(beerNameCaptor.capture(), beerStyleEnumCaptor.capture(),
                pageRequestCaptor.capture())).willReturn(beerPagedList);
    }

    @DisplayName("Test list beers - no parameters")
    @Test
    void testListBeers() throws Exception {
        mockMvc.perform(get("/api/v1/beer")
                    .accept(MediaType.APPLICATION_JSON))
                .andExpect(status().isOk())
                .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
                .andExpect(jsonPath("$.content", hasSize(2)))
                .andExpect(jsonPath("$.content[0].id", is(validBeer.getId().toString())));
    }
}

public MappingJackson2HttpMessageConverter jackson2HttpMessageConverter(){
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
    objectMapper.configure(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS, true);
    objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

    objectMapper.registerModule(new JavaTimeModule());
    return new MappingJackson2HttpMessageConverter(objectMapper);
}
}

The method which talking about is testListBeers(). When executing it with maven it picks up nested tests. When executing it in netbeans using project context menu - test project option it also picks up my nested tests. When my test class is opened and do "test file", it runs all tests except those in nested classes. When my test class is opened and click on green arrow on the left side of some nested test method, the above error is printed and test is not executed.

Trying picking up different spring boot starter parent / jupiter / surefire versions, but didnt get it to work as expected so far. Thanks for any help.



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source