模拟类属性Java / Android

时间:2012-06-06 08:02:06

标签: android unit-testing mocking

我有一个由某人编写的类,它将其属性公开为public而没有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)

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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

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

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

assertEquals("Scott", dependedOnObject.name);