如何 return 单元测试期间在流程中调用的静态方法的不同值?
How to return different value for a static method which is invoked during the flow during unit testing?
我正在尝试为以下代码段编写单元测试。
class ABC {
int getMyValue(final Activity activity) {
if(MyClass.getInstance(activity).getValue() == 1) return 10;
else return 20;
}
void doSomething() {
}
}
我试过类似的方法来测试 doSomething
函数。
mABC = new ABC();
public void test_doSomething() {
doReturn(20).when(mABC).getMyValue();
//validate
}
如何以类似方式测试 getMyValue
?我想断言,当值为 1 时,它会返回 10,而在所有其他情况下,它会返回 20。
我在我的 android 应用程序中这样做。有没有现成的框架可以帮助我做到这一点?
编辑:
MyClass
看起来像这样
public class MyClass {
private static Context mContext;
public static getInstance(Context context) {
mContext = context;
return new MyClass();
}
private MyClass() {}
public void getDreamValue() {
Settings.Secure.getInt(mContext.getContentResolver(), "dream_val", -1);
}
}
您可以考虑按如下方式修改您的 MyClass
。
public class MyClass {
private static Context mContext;
// Create a private variable that holds the instance.
private Myclass instance;
public static getInstance(Context context) {
mContext = context;
if (instance == null)
instance = new MyClass(); // Assign the instance here
return instance;
}
private MyClass() {}
public void getDreamValue() {
Settings.Secure.getInt(mContext.getContentResolver(), "dream_val", -1);
}
}
现在,当您使用 Robolectric 时,您可以在测试 class 中将 instance
值设置为模拟值,如下所示。
@RunWith(RobolectricTestRunner.class)
public class ABCTest {
@Mock
MyClass mockInstance;
@Mock
Context mockContext;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
// Set the mock instance for MyClass
ReflectionHelpers.setStaticField(MyClass.class, "instance", mockInstance);
}
@Test
public void testWhen1() {
doReturn(1).when(mockInstance).getDreamValue();
Assert.assertEquals(10, new ABC().getMyValue());
}
@Test
public void testWhenNot1() {
doReturn(2).when(mockInstance).getDreamValue();
Assert.assertEquals(20, new ABC().getMyValue());
}
@After
public void tearDown() {
// Set the instance to null again to enable further tests to run
ReflectionHelpers.setStaticField(MyClass.class, "instance", null);
}
}
希望对您有所帮助。
注意:您似乎在尝试提供 MyClass
的单例实例。因此,您真的不应该在 getInstance
函数中创建 MyClass
的新实例。我避免每次都创建一个新实例,在我的代码中使用 null
检查。
我正在尝试为以下代码段编写单元测试。
class ABC {
int getMyValue(final Activity activity) {
if(MyClass.getInstance(activity).getValue() == 1) return 10;
else return 20;
}
void doSomething() {
}
}
我试过类似的方法来测试 doSomething
函数。
mABC = new ABC();
public void test_doSomething() {
doReturn(20).when(mABC).getMyValue();
//validate
}
如何以类似方式测试 getMyValue
?我想断言,当值为 1 时,它会返回 10,而在所有其他情况下,它会返回 20。
我在我的 android 应用程序中这样做。有没有现成的框架可以帮助我做到这一点?
编辑:
MyClass
看起来像这样
public class MyClass {
private static Context mContext;
public static getInstance(Context context) {
mContext = context;
return new MyClass();
}
private MyClass() {}
public void getDreamValue() {
Settings.Secure.getInt(mContext.getContentResolver(), "dream_val", -1);
}
}
您可以考虑按如下方式修改您的 MyClass
。
public class MyClass {
private static Context mContext;
// Create a private variable that holds the instance.
private Myclass instance;
public static getInstance(Context context) {
mContext = context;
if (instance == null)
instance = new MyClass(); // Assign the instance here
return instance;
}
private MyClass() {}
public void getDreamValue() {
Settings.Secure.getInt(mContext.getContentResolver(), "dream_val", -1);
}
}
现在,当您使用 Robolectric 时,您可以在测试 class 中将 instance
值设置为模拟值,如下所示。
@RunWith(RobolectricTestRunner.class)
public class ABCTest {
@Mock
MyClass mockInstance;
@Mock
Context mockContext;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
// Set the mock instance for MyClass
ReflectionHelpers.setStaticField(MyClass.class, "instance", mockInstance);
}
@Test
public void testWhen1() {
doReturn(1).when(mockInstance).getDreamValue();
Assert.assertEquals(10, new ABC().getMyValue());
}
@Test
public void testWhenNot1() {
doReturn(2).when(mockInstance).getDreamValue();
Assert.assertEquals(20, new ABC().getMyValue());
}
@After
public void tearDown() {
// Set the instance to null again to enable further tests to run
ReflectionHelpers.setStaticField(MyClass.class, "instance", null);
}
}
希望对您有所帮助。
注意:您似乎在尝试提供 MyClass
的单例实例。因此,您真的不应该在 getInstance
函数中创建 MyClass
的新实例。我避免每次都创建一个新实例,在我的代码中使用 null
检查。