java如何测试其他类_java – 使用Mockito调用多个其他方法的方法的单元测试

Is it poorly designed and implemented code to have a method that internally calls other methods?

并不是的.但是我要说的是,在这种情况下,应该测试调用其他方法的方法,就像其他未经过单独测试的方法一样.

也就是说,它可以保护您免受公共方法在没有注意到的情况下停止调用其他方法的情况.

是的,它(有时)会产生大量的测试代码.我相信这就是重点:编写测试的痛苦是一个很好的线索,你可能想要考虑将这些子方法提取到一个单独的类中.

如果我可以忍受那些测试,那么我认为子方法还没有被提取出来.

What is the best practice and/or approach in writing a unit test for such a method (assuming it is itself a good idea) if one has chosen Mockito as their mocking framework?

我会做那样的事情:

public class Blah {

public int publicMethod() {

return innerMethod();

}

int innerMethod() {

return 0;

}

}

public class BlahTest {

@Test

public void blah() throws Exception {

Blah spy = spy(new Blah());

doReturn(1).when(spy).innerMethod();

assertThat(spy.publicMethod()).isEqualTo(1);

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 中,如果要使用 Mockito 来 mock 同一个对象属性中嵌套相同的对象多次,可以使用 `Answer` 接口来设置不同的返回值。具体来说,可以针对每个需要 mock 的对象设置一个返回值列表,然后在 `Answer` 的 `answer` 方法使用这些列表来模拟多次调用返回不同的值。 举个例子,假设有以下的类和对象: ```java public class User { private String name; private int age; public User(String name, int age) { this.name = name; this.age = age; } // getter and setter methods } public class Group { private String name; private List<User> users; public Group(String name, List<User> users) { this.name = name; this.users = users; } // getter and setter methods } User user1 = new User("Alice", 20); User user2 = new User("Bob", 25); List<User> users = new ArrayList<User>(); users.add(user1); users.add(user2); Group group = new Group("Group1", users); ``` 那么在单元测试中,可以这样 mock 对象属性中嵌套相同的对象多次: ```java import static org.mockito.Mockito.*; public class TestMockito { @Test public void testMockNestedObjects() { User userMock1 = mock(User.class); User userMock2 = mock(User.class); Group groupMock = mock(Group.class); when(userMock1.getName()).thenReturn("AliceMock1"); when(userMock2.getName()).thenReturn("BobMock1"); when(groupMock.getName()).thenReturn("GroupMock1"); when(userMock1.getAge()).thenReturn(21); when(userMock2.getAge()).thenReturn(26); List<List<User>> usersList = new ArrayList<List<User>>(); usersList.add(Arrays.asList(userMock1, userMock2)); usersList.add(Arrays.asList(userMock2, userMock1)); when(groupMock.getUsers()).thenAnswer(new Answer<List<List<User>>>() { private int count = 0; @Override public List<List<User>> answer(InvocationOnMock invocation) throws Throwable { return usersList.get(count++); } }); assertEquals("AliceMock1", userMock1.getName()); assertEquals("BobMock1", userMock2.getName()); assertEquals("GroupMock1", groupMock.getName()); assertEquals(users, groupMock.getUsers()); when(userMock1.getName()).thenReturn("AliceMock2"); when(userMock2.getName()).thenReturn("BobMock2"); when(groupMock.getName()).thenReturn("GroupMock2"); assertEquals("AliceMock2", userMock1.getName()); assertEquals("BobMock2", userMock2.getName()); assertEquals("GroupMock2", groupMock.getName()); assertEquals(users, groupMock.getUsers()); } } ``` 在上面的测试函数中,我们使用 `mock` 函数创建了需要 mock 的对象,然后分别设置了它们的属性和返回值列表。在 `when` 中,我们使用了这些返回值列表来模拟多次调用返回不同的值。在 `groupMock.getUsers()` 中,我们使用了 `Answer` 接口来模拟多次调用返回不同的值。最后在测试中,我们分别测试了每次调用返回的值是否正确。 需要注意的是,在使用 `Answer` 接口时,我们需要在 `answer` 方法中记录当前调用的次数,并从返回值列表中取出相应的值返回,这样才能模拟多次调用返回不同的值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值