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