2017-02-08 6 views
0

У меня есть следующие: классSpring Controller тест

Контроллер:

@Controller 
@RequestMapping("/") 
public class MainController { 

    @Inject 
    @Named("dbDaoService") 
    IDaoService dbDaoService; 

    @RequestMapping(method = RequestMethod.GET) 
    public String init(ModelMap model) { 
     List<Tags> tags = dbDaoService.getAllTags(); 
     model.addAttribute("tags", tags); 
     return "create"; 
    } 
} 

Класс обслуживания:

@Service("dbDaoService") 
public class DBDaoService implements IDaoService { 

    @PersistenceContext(unitName = "MyEntityManager") 
    private EntityManager entityManager; 

    @Override 
    @Transactional 
    public List<Tags> getAllTags() { 
     if(tags == null) { 
      TypedQuery<Tags> query = entityManager.createNamedQuery("Tags.findAll", Tags.class); 
      tags = query.getResultList(); 
     } 

     return tags; 
    } 
} 

тест:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = {WebConfig.class}) 
@WebAppConfiguration 
public class MainControllerTest { 

    private MockMvc mockMvc; 

    @Autowired 
    private WebApplicationContext context; 

    @Before 
    public void setUp() throws Exception { 
     mockMvc = MockMvcBuilders 
       .webAppContextSetup(context) 
       .build(); 
    } 

    @Test 
    public void init() throws Exception { 
     Tags tag1 = new Tags("first"); 
     Tags tag2 = new Tags("second"); 

     DBDaoService mock = org.mockito.Mockito.mock(DBDaoService.class); 
     when(mock.getAllTags()).thenReturn(Arrays.asList(tag1, tag2)); 

     mockMvc.perform(get("/")) 
      .andExpect(status().isOk()) 
      .andExpect(view().name("create")) 
      .andExpect(forwardedUrl("/WEB-INF/views/create.jsp")) 
      .andExpect(model().attribute("tags", hasItem(
        allOf(
          hasProperty("name", is("first")) 
        ) 
      ))) 
      .andExpect(model().attribute("tags", hasItem(
        allOf(
          hasProperty("name", is("second")) 
        ) 
      ))); 
    } 
} 

Когда я запустил MainControllerTest, он терпит неудачу, потому что он получает объекты «Тег» от DBDaoService (это означает, из базы данных), но я ожидаю, что он будет использовать макет службы.

Что случилось?

+0

кажется ваш класс обслуживания не хватает некоторых строки кода. Вы используете Override и Transactional, но метода нет. –

+0

Извините, это опечатка. Код правильный. – user2611714

+0

Возможный дубликат [модульного тестирования весеннего контроллера mvc с Целочисленным значением как @RequestParam] (http://stackoverflow.com/questions/39267966/unit-testing-for-spring-mvc-controller-with-integer-value-as -requestparam) –

ответ

3

Текущая тестовая установка загружает конфигурацию пружины и использует WebApplicationContext для обработки запроса из-за MockMvcBuilders.webAppContextSetup(context).build();. Таким образом, издевавшиеся бобы игнорируются, так как им не поручено участвовать.

Чтобы переплетить их, конфигурация должна быть обновлена ​​до MockMvcBuilders.standaloneSetup(controller).build().

Образец тестового примера должен выглядеть ниже (примечание дополнительный макет для MainController и обновления конфигурации в MockMvcBuilders.standaloneSetup вместе с инструкцией использовать Mockito аннотацию через MockitoAnnotations.initMocks)

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = {WebConfig.class}) 
@WebAppConfiguration 
public class MainControllerTest { 

    private MockMvc mockMvc; 

    @InjectMocks 
    private MainController controller; 

    @Mock 
    private DBDaoService daoService; 

    @Before 
    public void setUp() throws Exception { 
     MockitoAnnotations.initMocks(this); 

     InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); 
     viewResolver.setPrefix("/WEB-INF/view/"); 
     viewResolver.setSuffix(".jsp"); 

     mockMvc = MockMvcBuilders.standaloneSetup(controller) 
          .setViewResolvers(viewResolver) 
          .build(); 

     Tags tag1 = new Tags("first"); 
     Tags tag2 = new Tags("second"); 

     when(daoService.getAllTags()).thenReturn(Arrays.asList(tag1, tag2)); 
    } 

    @Test 
    public void init() throws Exception { 

     mockMvc.perform(get("/")) 
      .andExpect(status().isOk()) 
      .andExpect(view().name("create")) 
      .andExpect(forwardedUrl("/WEB-INF/views/create.jsp")) 
      .andExpect(model().attribute("tags", hasItem(
       allOf(
         hasProperty("name", is("first")) 
       ) 
      ))) 
      .andExpect(model().attribute("tags", hasItem(
       allOf(
         hasProperty("name", is("second")) 
       ) 
      ))); 
    } 
} 
+0

Хорошо, это здорово! Но у меня все еще есть две проблемы. Первый: ** иExpect (forwardedUrl ("/ WEB-INF/views/create.jsp")) ** вызывает ошибку: ** java.lang.AssertionError: переадресованный URL Ожидаемый:/WEB- INF/views/create.jsp Actual: create ** – user2611714

+0

Вторая проблема: ** иExpect (model(). Attribute ("tags", hasItem (allOf (hasProperty ("name", is ("first")))))) ** работает хорошо, но второй атрибут ** иExpect (model(). attribute ("tags", hasItem (allOf (hasProperty ("name", is ("second")))))) ** выдает ошибку * * NoSuchMethodError: org.hamcrest.Matcher.describeMismatch (Ljava/lang/Object; Lorg/hamcrest/Описание;) V ** – user2611714

+0

Что касается первой проблемы - см. Обновление. В случае автономной конфигурации требуется явный вид разрешающего средства. –