2017-08-02 3 views
0

Ich habe folgende Basistestklasse, die anderen Testklassen erweitern werden:Pass Parameter Junit Setup-Methode

@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(); 
    } 
} 

Es gibt zwei Arten von Testklassen, eine, die addFilters die MockMvcBuilders und andere diejenigen, die nicht addFilters. Ich kann keinen Parameter an setup übergeben. Gibt es eine Möglichkeit, keine Klasse für jede dieser beiden Kategorien von Testklassen zu erstellen?

Antwort

2

Ich bin einer von denen, die Elternklassen für Tests nicht verwenden möchten. Es ist besser, die Dienstprogramme zu verwenden, die Sie bei der Einrichtung Ihres Tests verwenden, damit die Entwickler wissen, worauf diese Tests angewiesen sind, ohne durch Hierarchien navigieren zu müssen, um @ Before, @ After oder was auch immer diese Tests beeinflussen könnten. Auch bei Hierarchien können Sie sehr bald mit Problemen konfrontiert werden, wenn Sie Implementierungen kombinieren wollen (Sie wissen, dass mehrere Eltern nicht erlaubt sind).

Nachdem ich das gesagt habe, würde ich für die von Ihnen vorgeschlagene Methode einfach diese Basisklasse abstrahieren und eine abstrakte Methode deklarieren, um festzustellen, ob der eigentliche Test diese Filter benötigt oder nicht. setup() muss dann nur diese Methode aufrufen und alles tun, was sie tun muss. Ihre Testklassen müssen nur diese abstrakte Methode implementieren (die im Grunde ein Wahr/Falsch-Flag ist).

Wenn Sie nur diese Art von Unterscheidung zwischen Ihren Tests haben, dann können Sie auch 2 weitere untergeordnete Klassen (Childs der Hauptbasisklasse) haben, von denen jede diese abstrakte Methode auf ihre eigene Weise implementiert. Ihre Tests können dann nur eine dieser untergeordneten Basisklassen erweitern und nichts implementieren.