2017-01-03 13 views
1

В пружинного MVC проекта У меня есть тест на содержание индекса/домашнюю страницу:тест JUnit для веб-сайта содержит одну строку или (эксклюзивный) другой строки

@RunWith(SpringRunner.class) 
@SpringBootTest 
@AutoConfigureMockMvc 
public class HomePageTest { 

    @Autowired 
    private MockMvc mockMvc; 

    @Test 
    public void shouldContainStrings() throws Exception { 
     this.mockMvc.perform(get("/")).andDo(print()).andExpect(status().isOk()) 
      .andExpect(content().string(containsString("Hello World"))); 
    } 
} 

Этот тест отлично работает до сих пор. Но теперь я хотел бы проверить наличие строк «Вход» или (исключение) «Выход», т. Е. Я хочу проверить, отображается ли в контенте ровно одна (а не ноль, а не обе) этих двух строк. Как я могу сопоставить это или условие?

Я попытался

... 
.andExpect(content().string(
     either(containsString("Login")).or(containsString("Logout")))); 
.... 

Но это не работает, либо (не выдаст ошибку, если обе строки отображаются на странице).

+1

Я думаю, что у вас должен быть два метода испытаний: каждый ожидает «Логин», потому что вы не вошли в систему, а другой ожидаете «Выход», поскольку вы не зарегистрированы. – davidxxx

+0

@ davidxxx: Хорошая точка. Но предположим, что они разные строки (а не «Вход/Выход»). Есть ли способ сопоставить этот XOR, или мне нужно написать свой собственный помощник? – user1583209

ответ

1

Пока string() метод принимает Hamcrest Искателя, я вижу два варианта здесь:

  1. Либо реализовать XOR-как согласовани себя (вы можете использовать этот ответ в качестве ссылки https://stackoverflow.com/a/29610402/1782379) ...
  2. . ..or использовать сложное условие, как «любой из них, но не как»

    Matcher<String> matcher = 
         allOf(
           is(either(containsString("Login")).or(containsString("Logout"))), 
           is(not(allOf(containsString("Login"), containsString("Logout"))))); 
    assertThat("_Login_", matcher); // OK 
    assertThat("_Logout_", matcher); // OK 
    assertThat("_Login_Logout_", matcher); // FAIL 
    assertThat("__", matcher); // FAIL 
    

лично я предпочитаю используйте второй вариант.

0
@Test 
public void containsOneOfTwoSubStringsExclusive() { 
    assertTrue((mainString.contains(substring1) && !mainString.contains(substring2)) || 
     (!mainString.contains(substring1) && mainString.contains(substring2))) 
} 
0

Мне просто нужно было написать на заказ для этого самостоятельно, когда я не смог найти подходящий.

 Смежные вопросы

  • Нет связанных вопросов^_^