MockMVC 测试 - MockBean 与 Mock 问题与mockito 何时?

问题描述 投票:0回答:1

我有以下模拟 mvc 测试类:

@SpringBootTest
@AutoConfigureMockMvc
class PersonControllerShould {

    @MockBean
    private PersonActivity personActivity;

    @MockBean
    private PersonMapper mapper;

    @Mock
    private MongoConfig mongoconfig;

    @Autowired
    private MockMvc mockMvc;

    @BeforeEach
    public void setUp() {
        MockitoAnnotations.openMocks(this);
    }
    
    // tests...
    
    }

请注意,我的

activity
mapper
类都是 spring 管理的
@Components.

我的 MongoConfig 类如下(不是组件),因此为什么我没有将其创建为 @MockBean(在尝试此操作时给了我错误)

@ConfigurationProperties(prefix = "cosmosdb")
@ConstructorBinding
public class MongoConfig {

    // rest of code...
}

任何

mockito
当我在
MongoConfig
上写的时候似乎都没有运行,这里的问题是什么——是否可以在mockmvc类中同时使用mockbean和mock?

控制器参考:

@CrossOrigin(origins = "*")
@RestController
@RequestMapping(value = "/person")
public class PersonController {

    private final PersonActivity personActivity;
    private final PersonMapper mapper;
    private final MongoConfig mongoconfig;

    public PersonController(
            @Autowired PersonActivity personActivity;
            @Autowired PersonMapper mapper;
            @Autowired MongoConfig mongoconfig;
    ) {

        this.personActivity = personActivity;
        this.mapper = mapper;
        this.mongoconfig = mongoconfig;
    }
    
        // rest mappings 

    }
spring spring-boot mockito junit5 mockmvc
1个回答
0
投票

不要混合使用

@Mock
(来自 Mockito)和
@MockBean
(来自 Spring Boot)注释。 Spring Boot 不会看到 Mockito 模拟,并且您通常希望您的 bean 由 Spring 管理(而不是让 Mockito 弄乱它们)。

@ConfigurationProperties
是配置数据,模拟它们没有意义。这些类的实例的属性绑定到应用程序属性的值,因此您可以简单地设置所需的属性。默认情况下,Spring Boot 测试在“test”配置文件处于活动状态的情况下运行,但您可以在测试中使用
@ActiveProfiles
注释来选择不同的配置文件。要设置测试配置文件的属性,请在测试资源中添加新的属性文件:
src/test/resources/application-test.properties
,它定义测试中使用的值。如果您指定不同的配置文件,例如“集成”,请相应地更改文件名:
application-integration.properties

或者,直接在

@SpringBootTest
注释中覆盖配置值:

@SpringBootTest(
    properties = {
      "cosmosdb.url=url-to-be-used-in-your-test",
      "cosmosdb.user=testuser",
      "cosmosdb.password=testpassword"
    }
)
class PersonControllerShould {
  // ...
}
© www.soinside.com 2019 - 2024. All rights reserved.