4

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

    } 

Package hierarchy

+0

Es gibt keinen Frühling 4.6.2 MVC Release ist . – fatiherdem

+0

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

+0

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. –

Antwort

0

Verwenden @RunWith(MockitoJUnitRunner.class) die @InjectMocks und anderen Anmerkungen an der Arbeit