当前位置: 首页 > 面试题库 >

验证是否已调用所有getter方法

卜鹏
2023-03-14
问题内容

我需要进行以下测试,以验证是否已调用Person类的所有getter。到目前为止,我已经使用了Mockito的verify()来确保每个getter都被调用。有没有办法通过反思做到这一点?可能是将新的吸气剂添加到Person类的情况,但是测试会错过这一点。

public class GetterTest {
    class Person{

        private String firstname;
        private String lastname;

        public String getFirstname() {
            return firstname;
        }

        public String getLastname() {
            return lastname;
        }
    }

    @Test
    public void testAllGettersCalled() throws IntrospectionException{
        Person personMock = mock(Person.class);
        personMock.getFirstname();
        personMock.getLastname();

        for(PropertyDescriptor property : Introspector.getBeanInfo(Person.class).getPropertyDescriptors()) {
            verify(personMock, atLeast(1)).getFirstname();
            //**How to verify against any getter method and not just getFirstName()???**
        }
    }
}

问题答案:

通常,不要嘲笑被测类。如果您的测试是针对Person的,则您永远都不会看到Mockito.mock(Person.class)它,因为这很明显地表明您正在测试模拟框架而不是被测系统。

相反,您可能想创建一个spy(new Person()),它将使用一个真正的构造函数创建一个真实的Person实现,然后将其数据复制到Mockito生成的代理中。您可以MockingDetails.getInvocations()用来反省检查是否已调用每个getter。

// This code is untested, but should get the point across. Edits welcome.
// 2016-01-20: Integrated feedback from Georgios Stathis. Thanks Georgios!

@Test
public void callAllGetters() throws Exception {
  Person personSpy = spy(new Person());
  personSpy.getFirstname();
  personSpy.getLastname();

  assertAllGettersCalled(personSpy, Person.class);
}

private static void assertAllGettersCalled(Object spy, Class<?> clazz) {
  BeanInfo beanInfo = Introspector.getBeanInfo(clazz);
  Set<Method> setOfDescriptors = beanInfo.getPropertyDescriptors()
      .stream()
      .map(PropertyDescriptor::getReadMethod)
      .filter(p -> !p.getName().contains("getClass"))
      .collect(Collectors.toSet());
  MockingDetails details = Mockito.mockingDetails(spy);
  Set<Method> setOfTestedMethods = details.getInvocations()
      .stream()
      .map(InvocationOnMock::getMethod)
      .collect(Collectors.toSet());
  setOfDescriptors.removeAll(setOfTestedMethods);
  // The only remaining descriptors are untested.
  assertThat(setOfDescriptors).isEmpty();
}

有可能是一个方法来调用verifyinvoke对的Mockito产生的间谍,但似乎很脆弱,非常依赖于内部的Mockito。

顺便说一句,测试bean风格的吸气剂似乎在浪费时间/精力。通常,重点关注可能会更改或中断的测试实现。



 类似资料:
  • 我正在为我的城镇里的当地企业创建一个目录。我允许每个企业在网站上创建一个个人资料,他们可以上传联系信息,照片,他们在谷歌地图上的位置,等等。 我对php有很好的了解,但我还没有达到行业标准。 我只是在寻找一些建议,以验证业务是登录在管理页面。我现在的方法是,当他们的用户名和密码被验证后,我为他们创建一个会话: 这基本上只是一个使用他们的业务ID的会话,该会话取自mySQL数据库中的Business

  • 官方: http://developer.android.com/reference/android/os/asynctask.html onProgressUpdate(Progress...),在调用publishProgress(Progress...)后在UI线程上调用.执行的时间未定义。此方法用于在后台计算仍在执行时,在用户界面中显示任何形式的进度。例如,它可以用于动画进度条或在文本字段

  • 问题内容: 我想测试一些在同一类中调用其他方法的方法。它们基本上是相同的方法,但是具有不同数量的参数,因为数据库中有一些默认值。我在这个上展示 因此,我想测试在调用方法getPrice(int)时是否调用了方法getPriceForOne()。基本上像平常一样调用getPrice(int)并模拟getPriceForOne。 请记住,我有一个更为复杂的文件,该文件可供其他人使用,它们必须全部放在一

  • 我有点被这个函数的名字搞糊涂了。为什么不只是?它没有验证的是什么?如果我使用这个函数,它还能在某些情况下抛出吗?我能不能以某种方式“尝试添加”而不得到任何异常,并且如果失败时只返回false? 编辑:我认为这两个问题是相互对立的。如果我用调用,它实际上是添加了无效的头,还是如果它们无效就返回false?

  • 我试图按照API密钥身份验证代码从这个答案:https://stackoverflow.com/a/48448901 我创建了我的过滤器类: 然后我实现了我的安全配置: 当我用头作为请求的一部分对应用程序进行外部调用时,我得到一个403禁止响应。我可以看到过滤器从头中拉出键。这部分正在工作。 但是,不会调用authenticate()方法来检查头是否有效。我不确定我错过了什么,代码在我看来是一样的

  • 我需要一个PDO函数,如果用户course_id已经存在,它将返回false。 这是我的学生表列 标准标识 A这是我的课程表 课程编号 我还有报名表 id 我需要验证用户是否已经使用PHP PDO函数学习了一门课程,以及学习了特定课程的学生人数。