Этот класс находится в верхней части иерархии моих тестов:
@TestPropertySource("/test.properties")
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public abstract class ApplicationAbstractTest {
}
И еще несколько тестовых классов:
@WebAppConfiguration
@ActiveProfiles("mysql")
abstract public class AbstractControllerTest extends ApplicationAbstractTest {
protected MockMvc mockMvc;
@Autowired
private WebApplicationContext webApplicationContext;
@PostConstruct
private void postConstruct() {
mockMvc = MockMvcBuilders
.webAppContextSetup(webApplicationContext)
.apply(springSecurity())
.build();
}
}
JsonUserServiceTest:
@ActiveProfiles("json")
public class JsonUserServiceTest extends ApplicationAbstractTest {
@Before
public void setUp() throws Exception {
...
}
}
КонтактКонтроллерТест:
public class ContactControllerTest extends AbstractControllerTest {
@Test
public void testGet() throws Exception {
mockMvc.perform(get("/update-" + ID + "-contact")
.with(userAuth(USER)))
// .andExpect(status().isOk())
.andDo(print())
.andExpect(view().name("details"))
.andExpect(forwardedUrl("/WEB-INF/jsp/details.jsp"));
}
}
Итак, когда я запускаю ContactControllerTest
, он выполняется успешно, и метод print
показывает мне:
Handler:
Type = com.telecom.web.ContactController
Method = public java.lang.String com.myApp.web.ContactController.details(java.lang.Integer,org.springframework.ui.ModelMap)
Но когда я запускаю все тесты, то JsonUserServiceTest
запускается первым, ContactControllerTest
терпит неудачу. И print
показывает:
Handler:
Type = null
...
java.lang.AssertionError: No ModelAndView found
Что не так в конфигурации? Или как устранить неполадки?
UPD: заодно тестил так, всегда работает нормально:
public class UserControllerTest extends AbstractControllerTest {
@Test
public void testRegister() throws Exception {
mockMvc.perform(get("/register"))
.andDo(print())
.andExpect(view().name("profile"))
.andExpect(forwardedUrl("/WEB-INF/jsp/profile.jsp"));
}
}
UPD: тестирую метод контроллера:
@GetMapping("/update-{id}-contact")
public String details(@PathVariable Integer id, ModelMap model) {
Integer userId = AuthorizedUser.id();
LOG.info("get contact {} for User {}", id, userId);
Contact contact = service.get(id, userId);
model.addAttribute("contact", contact);
return "details";
}
У меня тоже есть такая фасоль:
@Bean
public InternalResourceViewResolver viewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setViewClass(JstlView.class);
viewResolver.setPrefix("/WEB-INF/jsp/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
UPD: Пробовал настроить mockMvc в отдельном классе:
@Configuration
public class TestConfig {
@Autowired
private WebApplicationContext webApplicationContext;
@Bean
public MockMvc mockMvc() {
return MockMvcBuilders
.webAppContextSetup(webApplicationContext)
.apply(springSecurity())
.build();
}
}
И добавил сюда:
@WebAppConfiguration
@ContextConfiguration(classes = {TestConfig.class})
@ActiveProfiles("mysql")
abstract public class AbstractControllerTest extends ApplicationAbstractTest {
но я получил:
java.lang.IllegalStateException: springSecurityFilterChain не может быть нулевым. Убедитесь, что Bean с именем springSecurityFilterChain, реализующий фильтр, присутствует или внедрите фильтр, который будет использоваться.
@ActiveProfiles
принимает массив. Что произойдет, если вы дадите ему@ActiveProfiles({ "json", "mysql" })
? - person Roddy of the Frozen Peas   schedule 27.03.2017NoUniqueBeanDefinitionException
, так как у меня есть две реализации репозитория, помеченные разными профилями:@Profile("json")
и@Profile("mysql")
- person Pavlo Plynko   schedule 27.03.2017