最新消息:Welcome to the puzzle paradise for programmers! Here, a well-designed puzzle awaits you. From code logic puzzles to algorithmic challenges, each level is closely centered on the programmer's expertise and skills. Whether you're a novice programmer or an experienced tech guru, you'll find your own challenges on this site. In the process of solving puzzles, you can not only exercise your thinking skills, but also deepen your understanding and application of programming knowledge. Come to start this puzzle journey full of wisdom and challenges, with many programmers to compete with each other and show your programming wisdom! Translated with DeepL.com (free version)

spring - @MockBean with Gradle giving indeterministic class for integration test - Stack Overflow

matteradmin6PV0评论

I am using the following for my integration test

@ExtendWith(SpringExtension::class)
@SpringBootTest(
    webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT,
    classes = [TestSecurityConfig::class],
    properties = ["spring.main.allow-bean-definition-overriding=true"],
)
@AutoConfigureMockMvc
class ImportControllerIT {
    @MockBean
    private lateinit var restClientImpl: RestClientImpl

     @MockBean
     private lateinit var fileManagerImpl: FileManagerImpl

    @Autowired
    private lateinit var mockMvc: MockMvc

 ....
    @BeforeAll
    fun setup() {
        whenever(restClientImpl.getFileContent(uuid, null)).thenReturn(getFileContent("employee.csv"))

        RestAssured.port = port
    }

Wherever I run the code using IntellJ, I see the Mock Bean being used, but when I test the behaviour using gradle command like bash ./gradlew -i integrationTest I see the mock bean and the actual bean being picked randomly.

What am I doing wrong?

I am using the following for my integration test

@ExtendWith(SpringExtension::class)
@SpringBootTest(
    webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT,
    classes = [TestSecurityConfig::class],
    properties = ["spring.main.allow-bean-definition-overriding=true"],
)
@AutoConfigureMockMvc
class ImportControllerIT {
    @MockBean
    private lateinit var restClientImpl: RestClientImpl

     @MockBean
     private lateinit var fileManagerImpl: FileManagerImpl

    @Autowired
    private lateinit var mockMvc: MockMvc

 ....
    @BeforeAll
    fun setup() {
        whenever(restClientImpl.getFileContent(uuid, null)).thenReturn(getFileContent("employee.csv"))

        RestAssured.port = port
    }

Wherever I run the code using IntellJ, I see the Mock Bean being used, but when I test the behaviour using gradle command like bash ./gradlew -i integrationTest I see the mock bean and the actual bean being picked randomly.

What am I doing wrong?

Share Improve this question edited Nov 19, 2024 at 9:02 Anish B. 17.1k4 gold badges28 silver badges50 bronze badges asked Nov 16, 2024 at 17:30 Suraj MenonSuraj Menon 1,6044 gold badges28 silver badges53 bronze badges 1
  • Can you annotate your field with @Primary? – knittl Commented Nov 19, 2024 at 16:17
Add a comment  | 

1 Answer 1

Reset to default 1

I'm not 100% sure but it looks like spring.main.allow-bean-definition-overriding=true is causing the randomness of picking the mock bean and the actual bean.

Recommendation: Avoid doing the override of bean definition especially in tests.

Solution: Fix your implementation so that you don't need to override any kind of bean definitions in tests.

Post a comment

comment list (0)

  1. No comments so far