1

Ist es möglich, @Valid Anmerkungen mit MockMvc und MockitoJUnitRunner zu testen? Ich kann das meiste Verhalten meines CRUD-Controllers testen, aber die Validierung scheint die Verwendung von Spring's JUnit-Runner zu erfordern, den gesamten Kontext zu erstellen und die JPA-Repo-Implementierung zu erstellen, die eine Menge Zeug erfordert.Unit Test Feldvalidierung mit MockMvc aber ohne Spring Kontext?

Der folgende Test versucht, eine POST-Methode zu testen, die eine Customer Entität empfängt, wobei das Feld firstName mit @Size(min=2, max=20) gekennzeichnet ist. Das Ergebnis ist

java.lang.AssertionError: View name expected:<edit> but was:<redirect:/info> 

So wurde die Validierung nicht ausgeführt.

@RunWith(MockitoJUnitRunner.class) 
public class DataControllerTest { 
    @Mock 
    CustomerRepository mockRepo; 

    @InjectMocks 
    private DataController controller; 

    MockMvc mockmvc; 

    @Before 
    public void init() { 
     MockitoAnnotations.initMocks(this); 
     mockmvc = MockMvcBuilders.standaloneSetup(controller).build(); 
    } 

    @Test 
    public void testBadSubmit() throws Exception { 
     mockmvc.perform(MockMvcRequestBuilders.post("/edit/1") 
      .param("firstName", "a")) 
      .andExpect(MockMvcResultMatchers.view().name("edit")); 
     Mockito.verifyZeroInteractions(mockRepo); 
    } 
} 

Controller-Klasse:

@Controller 
public class DataController { 
    @Autowired 
    public CustomerRepository crep; 

    ... 

    @RequestMapping(value = {"/edit/{id}"}, method = RequestMethod.POST) 
    public String add(Model model, @Valid Customer customer, Errors result) { 
     if (result.hasErrors()) { 
      return "edit"; 
     } 
     crep.save(customer); 
     return "redirect:/info"; 
    } 

Entity:

@Entity 
public class Customer { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id = null; 

    @Column(length=20) 
    @Size(min=2, max=20) 
    private String firstName; 
    ... 
} 

JPA Repository-Schnittstelle:

@Repository 
public interface CustomerRepository extends JpaRepository<Customer, Long> { 

    List<Customer> findByLastName(String lastName); 
} 

Antwort

1

Der Zweck des SpringJUnit4ClassRunner ist die Anwendung automatisch c zu laden ontext und verdrahte alles automatisch. Sie sollten MockitoJUnitRunner verwenden können, aber Sie müssen den Anwendungskontext laden, den Sie manuell in Ihrem Test verwenden möchten. Unabhängig davon müssen Sie jedoch einen Anwendungskontext laden, da der Aufruf DataController#add() über Spring die einzige Möglichkeit ist, die @Valid Annotation zu verarbeiten.

BEARBEITEN: Wenn das eigentliche Problem hier das Laden des JPA-Repositorys ist, können Sie MockitoJUnitRunner verwenden und einfach einen Testanwendungskontext laden, in dem ein Mock-JPA-Repository mit wenig oder gar keinen Kosten manuell verdrahtet wird.

+0

Ich bin mir nicht sicher, wie ein Anwendungskontext zu erstellen, die die '@ Valid' Anmerkungen verarbeitet, sondern um die fehlende JPA-Repository-Bean nicht beschweren, es sei denn, ich' set @Autowired (required = false) '. – Arthur

+0

Die Annotation "@ Valid" wird getestet, solange die umschließende Klasse mit der Testklasse verdrahtet ist oder von der Testklasse aus dem Anwendungskontext abgerufen wird. Lassen Sie es mich wissen, wenn Sie einen Beispielcode benötigen. – entpnerd

+0

Wenn es kein großes Problem ist, geben Sie bitte ein Beispiel. – Arthur

Verwandte Themen