gpt4 book ai didi

java - Mockito 并不是在 mock 我的背景

转载 作者:行者123 更新时间:2023-12-02 11:45:33 26 4
gpt4 key购买 nike

我有以下设置

public class Blo{
private Context mContext;

public Blo(Context context){
mContext=context;
}

public void updateIfNecessary(Cat cat){
if(cat.isUpdateNecessary()){
mContext.getContentResolver().update(cat.getUri(), cat.toContentValues(),null,null);
}
}
}

现在我正在尝试创建一个 Mockito spy 来查看更新是否执行。

public class BloTest{
@Test
public void testCatNotUpdatesIfUnnecessary(){
Context context = Mockito.spy(InstrumentationRegistry.getContext());
Blo blo = new Blo(context);
Cat cat = createCat();
cat.setUpdateNecessary(false);
final int expected = 1;
Mockito.doReturn(1).when(context).getContentResolver();
assertEquals(1, blo.updateIfNecessary(cat));
}
}

现在我当然不知道我是否正确地进行了测试。但即使在我们进行测试之前,当我尝试运行测试时,我也遇到了错误:

org.mockito.exceptions.base.MockitoException:
Mockito cannot mock this class: class android.app.ContextImpl.

Mockito can only mock non-private & non-final classes.

如何正确设置测试用例,以便能够在更新时和未更新时进行测试?这是我第一次使用 Mockito。

最佳答案

您的生产代码违反了德米特法则(又名不要与陌生人交谈!)您可以在此处访问间接依赖:

mContext.getContentResolver().update()

因此,您必须付出更多努力来配置测试用例:

   @Rule 
public MockitoRule mockitoRule = MockitoJUnit.rule();
@Mock
Context context;
@Mock
ContentResolver contentResolver;

@Test
public void testCatNotUpdatesIfUnnecessary(){
doReturn(contentResolver).when(context).getContentResolver()
Blo blo = new Blo(context);
Cat cat = createCat();
cat.setUpdateNecessary(false);

blo.updateIfNecessary(cat);

verify(contentResolver)
.update(cat.getUri(), cat.toContentValues(),null,null);
}

但是,
更好的解决方案是重构生产代码,直接注入(inject) ContentResolver 实例,而不是 Context...

关于java - Mockito 并不是在 mock 我的背景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48231360/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com