在ClassUnderTest中模拟公共方法调用处理ArrayLists

时间:2015-11-05 11:51:04

标签: java unit-testing mocking mockito

假设我有以下情况:

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

}

这会失败,因为它们不是对等的。

2 个答案:

答案 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);

详情请见此处 https://joel-costigliola.github.io/assertj/assertj-core-features-highlight.html#extracted-method-result-assertion

https://github.com/joel-costigliola/assertj-examples/blob/master/assertions-examples/src/test/java/org/assertj/examples/ListSpecificAssertionsExamples.java

答案 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}}