Skip to content

Provide guidance on using @Nested within test classes with complex inheritance and annotation arrangements #28466

Open
@GeorgiPetkov

Description

@GeorgiPetkov

I've provided a minimal JUnit Jupiter test ConcreteServiceTest reproducing the problem. Please check the code first. The issue is that the mock is not reset so the second test fails since there are 2 calls instead of the expected 1. The use case has a common base service and similarly base test class.

Some observations:

  • If the @Import(ConcreteService.class) is moved on top of the base class the tests pass.
  • If the tests are flattened (not using @Nested test class) then the tests pass.
  • @AfterEach void clearMocks() { reset(dependency); } would make the tests pass as well. I've chosen this as the simplest workaround for the time being (assuming the issue will be fixed and then the method will be simply deleted instead of altering the structure of my code).

Spring Boot version: 2.6.2

import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.RepeatedTest;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.context.annotation.Import;
import org.springframework.test.context.junit.jupiter.SpringExtension;

import static org.mockito.Mockito.verify;

@Import(ConcreteService.class)
class ConcreteServiceTest extends BaseServiceTest {
}

@ExtendWith(SpringExtension.class)
abstract class BaseServiceTest {

    @MockBean
    private Runnable dependency;
    @Autowired
    private BaseService service;

    @Nested
    class Suite {

        @RepeatedTest(2)
        void test() {
            service.serve();

            verify(dependency).run();
        }
    }
}

class ConcreteService extends BaseService {
}

abstract class BaseService {

    @Autowired
    private Runnable dependency;

    public void serve() {
        dependency.run();
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions