Ich wirklich gesucht und folgte die Schritte zum Erstellen einer Unit-Test-Klasse für Frühjahr MVC-Controller, jedoch Unit-Test läuft mit einem Green-Pass-Flag Das Framework verwendet jedoch die ursprüngliche Serviceklasse und ruft die Datenbank auf. Ich verspottete die Klasse und verwendete @InjectMocks
zusammen mit MockitoAnnotations.initMocks(this)
. Wenn der Test ausgeführt wird, verwendet der Controller das ursprüngliche Dienstobjekt lieber als das gespottete Objekt. Ich schätze es sehr, wenn mir jemand in dieser Hinsicht helfen kann.Frühling MVC Release 4.2.6 scheint keine Probe Service in den Controller injiziert beim Testen Controller-Methode
Hier sind UserManager
(Service Klasse), UserRegisterController
(Controller), TestUserRegisterController
(-Test Klasse) Klassen mit einem Bild der Eclipse- Paketstruktur
-Service :
@Service
public class UserManager {
protected Map<String, String> getAllCertificates() {
Map<String, String> allCertificates = new HashMap<String, String>();
//call to database
return allCertificates;
}
protected User getUser(int userId) {
//create session
User user = session.get(User.class, userId);
//close session
return user;
}
}
Controller:
@Controller
public class UserRegisterController {
@Autowired
private UserManager manager;
@InitBinder
public void initBinder(WebDataBinder binder) {
//do some work
}
@RequestMapping(value = "/user.html", method = RequestMethod.GET)
public ModelAndView getUser(@RequestParam(value="userId", defaultValue="-1") String userId) {
User user1;
user1 = this.manager.getUser(Integer.parseInt(userId));
if (user1 == null) {
user1 = new User();
}
ModelAndView view = new ModelAndView("User", "user1", user1);
view.addObject("allCertificatesMap", this.manager.getAllCertificates());
return view;
}
@ModelAttribute
public void setModelAttribute(Model model) {
model.addAttribute("PageHeader", "lable.pageHeader");
}
}
Prüfklasse:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("test-spring-dispatcher-servlet.xml")
@WebAppConfiguration
public class TestUserRegisterController {
@Mock
private UserManager userManager;
@InjectMocks
private UserRegisterController userRegisterController;
@Autowired
private WebApplicationContext wac;
private MockMvc mockMvc;
@Before
public void setUp() throws Exception {
// Process mock annotations
MockitoAnnotations.initMocks(this);
User user2 = new User();
user2.setUserId(10006);
user2.setUserName("Reza");
user2.setHobby("Quadcopter");
user2.setPhone("4032376295");
when(this.userManager.getUser(10006)).thenReturn(user2);
when(this.userManager.getAllCertificates()).thenReturn(new HashMap<String, String>());
this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
}
@Test
public void getUser() {
try {
this.mockMvc.perform(get("/user.html").param("userId", "10006"))
.andExpect(status().isOk())
.andExpect(forwardedUrl("/WEB-INF/jsp/User.jsp"))
.andExpect(MockMvcResultMatchers.view().name("User"))
.andExpect(model().attributeExists("allCertificatesMap"));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Es gibt keinen Frühling 4.6.2 MVC Release ist . – fatiherdem
Hallo, Dies ist von mir gelesene Datei in der Frühjahrs-Bibliothek, die ich heruntergeladen habe. "Spring Framework Version 4.2.6.RELEASE". Du hast Recht, es hat keine MVC drin. – user3496320
Es funktioniert wie erwartet. Yo hast 2 Instanzen deines Controllers mit einem Mock und einen regelmäßig konfiguriert. Grundsätzlich wird die Art, wie Sie versuchen, einen Mock zu injizieren, nicht funktionieren. Erstellen Sie einen Testkontext, der eine Kopie für die Bean (n) erstellt, die Sie maskieren möchten, und geben Sie der Bean den gleichen Namen, damit sie die ursprüngliche Bean überschreibt. –