我有以下基础测试类,其他测试类将扩展:
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
@ActiveProfiles("test")
public class BaseControllerTest {
@Autowired
protected Filter springSecurityFilterChain;
@Autowired
protected MockMvc mockMvc;
@MockBean
protected AuthenticationManager authenticationManager;
@Autowired
protected WebApplicationContext context;
@Before
public void setup() throws SQLException {
mockMvc = MockMvcBuilders.webAppContextSetup(context)
.addFilters(springSecurityFilterChain).build();
Server webServer = Server.createWebServer("-web", "-webAllowOthers", "-webPort", "8082");
webServer.start();
}
}
有两种类型的测试类,一种是addFilters
到MockMvcBuilders
,另一种是addFilters
。我无法将任何参数传递给setup
。有没有办法不为这两类测试类中的每一类创建一个类?
答案 0 :(得分:2)
我是其中一个不喜欢使用父类进行测试的人之一。最好使用您在测试设置中包含的实用程序,以便开发人员了解这些测试所依赖的内容,而无需浏览层次结构来查找@ Before,@ After,或者其他什么这可能会影响那些测试。此外,对于层次结构,当您想要组合实现时,您很快就会遇到问题(您知道,不允许使用多个父项)。
话虽如此,对于你提出的方法,我只是将这个Base类抽象化并声明一个抽象方法来识别实际测试是否需要这些过滤器。 setup()然后只需要调用该方法并执行它需要做的任何事情。你的测试类只需要实现那个抽象方法(它基本上是一个真/假标志)。
如果您只在测试之间进行这种区分,那么您还可以再有2个子基类(主基类的子类),每个类都以自己的方式实现该抽象方法。然后,您的测试可以只扩展其中一个子类,而不实现任何内容。