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);
}
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
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
Wenn es kein großes Problem ist, geben Sie bitte ein Beispiel. – Arthur