我有以下模拟 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
}
不要混合使用
@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 {
// ...
}