【问题标题】:Mocking class properties Java/Android模拟类属性 Java/Android
【发布时间】:2012-06-06 08:02:06
【问题描述】:

我有一个由某人编写的类,它将其属性公开为没有 getter/setter。

现在我想使用 Android Mocking 框架来模拟这个类。 我不想修改 class_under_test(除非需要)。我知道这是一种不好的编程习惯,但是有没有办法模拟像

这样的属性
AndroidMock.expect(myMockClass.name).andReturn('Scott');

运行测试用例时出现异常:

java.lang.IllegalStateException: no last call on a mock available
at org.easymock.EasyMock.getControlForLastCall(EasyMock.java:174)
at org.easymock.EasyMock.expect(EasyMock.java:156)
at com.google.android.testing.mocking.AndroidMock.expect(AndroidMock.java:264)
at com.akshat.test.TestPerson.testGetName(TestPerson.java:41)
at java.lang.reflect.Method.invokeNative(Native Method)
at android.test.InstrumentationTestCase.runMethod(InstrumentationTestCase.java:204)
at android.test.InstrumentationTestCase.runTest(InstrumentationTestCase.java:194)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:529)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1448)

【问题讨论】:

  • “我有一个由某人编写的类,它将其属性公开为没有 getter/setter。”我认为您的意思是字段,而不是属性。属性通常是字段、getter 和 setter 的组合。谷歌“java 字段属性”(不带引号)了解更多详情。

标签: android unit-testing mocking


【解决方案1】:

为类创建一个模拟对象并为属性变量赋值。

Mock mock = Mock.create(ClassName.class);
mock.property = value;

【讨论】:

    【解决方案2】:

    你为什么要模拟这个类?如果唯一的行为是微不足道的(即字段),那么您可以照原样使用类的字段。

    例如,如果将其设置为存根,请在测试设置中执行此操作:

    DependedOnClass dependedOnObject = new DependedOnClass();
    dependedOnObject.name = "Scott";
    objectUnderTest.dependedOnObject = dependedOnObject;    // inject the depended on object
    

    或者如果将其设置为模拟,则在您的断言中执行此操作:

    assertEquals("Scott", dependedOnObject.name);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-16
      • 2018-09-21
      • 2018-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-20
      相关资源
      最近更新 更多