假设我有以下情况:
public class ClassUnderTest()
{
private Service myService;
public SomeData method1(final InputData input) {
final SomeData result = method2(myservice.getOutput(input));
return result;
}
public SomeData method2(final OutputData output){
//Do something with the OutputData
}
}
现在我想测试method1()。因为它调用method2()我还需要确保method2()内的所有内容都能正常工作。但问题是,因为我测试了所有的方法,我会分别测试method2()。
那么我怎么知道test method1()而不考虑method2()。我很乐意在调用method2()时使用doNothing(),但由于它是我想要测试而不是嘲笑的类,所以我无法做到。或者有可能吗?
2.。)当两个ArrayList都只有两个具有相同值的对象时,如何断言两个ArrayList的相等性。例如:
@Test
public void test(){
User user1 = new User();
User user2 = new User();
user1.setMail("mail");
user2.setMail("mail");
list<User> list1 = new ArrayList<User>();
list<User> list2 = new ArrayList<User>();
list1.add(user1);
list2.add(user2);
assertEquals(list1,list2);
}
这会失败,因为它们不是对等的。
答案 0 :(得分:1)
你应该分开问这些问题,但我试着回答两个问题:
<强> 1。部分模拟与Mockito
我不确定部分嘲笑是否可取。但有了mockito它是可能的。你可以嘲笑你的ClassUnderTest
并告诉mockito在调用method1
时执行真正的方法
ClassUnderTest mock = Mockito.mock(ClassUnderTest.class);
when(mock.method1()).thenCallRealMethod();
请参阅http://site.mockito.org/mockito/docs/current/org/mockito/Mockito.html#partial_mocks
<强> 2。关于集合的断言
AssertJ为集合提供了非常好的断言 - 例如:
List<String> list1 = Arrays.asList("1", "2", "3");
List<String> list2 = Arrays.asList("1", "2", "3");
then(list1).containsExactlyElementsOf(list2);
答案 1 :(得分:0)
Mathias已经回答了您问题的第一部分。使用PowerMock将是另一种选择。
samePropertyValuesAs
关于列表断言,您可以在Hamcrest中使用功能强大的import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.hamcrest.Matchers.samePropertyValuesAs;
@Test
public void yourTest() throws Exception {
....
assertThat(list1, containsInAnyOrder(userCollectionToMatcher(list2)));
}
public Collection<Matcher<? super User>> userCollectionToMatcher(Collection<User> users) {
return users.stream().map(u -> samePropertyValuesAs(u)).collect(Collectors.toList());
}
匹配器。
{{1}}