Java 如何在JUnit4中获取上下文
我有一门课:Java 如何在JUnit4中获取上下文,java,android,unit-testing,junit4,android-context,Java,Android,Unit Testing,Junit4,Android Context,我有一门课: public class Unit { private int id; private String unit; private String dimension; private Float factor; private Context ctx; public Unit(Context context){ this.ctx = context; } public Unit(String unit, String
public class Unit {
private int id;
private String unit;
private String dimension;
private Float factor;
private Context ctx;
public Unit(Context context){ this.ctx = context; }
public Unit(String unit, String dimension, Float factor, Context context) {
super();
this.ctx = context;
setUnit(unit);
setDimension(dimension);
setFactor(factor);
}
public void setDimension(String d) {
String[] dimensions = ctx.getResources().getStringArray(R.array.dimensions_array);
if(!Arrays.asList(dimensions).contains(d)){
throw new IllegalArgumentException("Dimension is not one of the permittable dimension names");
}
this.dimension = d;
}
...
}
为了根据strings.xml中的字符串数组验证“String dimension”,我需要调用getResources(),为此我需要一个上下文(这是我在这个类中有上下文的唯一原因)
这在应用程序中运行良好,但现在我想为类Unit编写JUnit4测试,并调用Unit(),例如:
public class UnitTest {
Unit unit;
@Before
public void init() throws Exception {
System.out.println("Setting up ...");
unit = new Unit("dm","length", (float) 0.1,some_context); // What context should I put here?
}
@Test
...
}
如何在类UnitTest中获取上下文?或者我应该以某种方式重写测试吗?您可以使用您选择的配置有模拟库,例如..您可以使用您选择的配置有模拟库,例如..谢谢您的回复。我不确定我是否理解“doStuff thenReturn”部分。如果我忽略了这一部分(我可以吗?),我会在“unit=new unit(…)”行上得到一个NPE,这是由于setDimension()方法中的“String[]dimensions=ctx.getResources()…”引起的。我还尝试在init()中调用“MockitoAnnotations.initMocks(this);”,因为我在某些地方读到了这是必需的。如果使用
@RunWith(MockitoJunitRunner.class)
则不需要MockitoAnnotations.initMocks(this)
2<代码>何时(context.doStuff())。然后返回(“stuff”)代码>显示了如何模拟与模拟对象的交互。在本例中,我假设您想要模拟一个名为doStuff()
的方法。看起来您希望在(context.getResources())时将其更改为代码>谢谢,这非常有帮助。我实际使用了when(context.getResources().getStringArray(R.array.dimensions_array)).thenReturn(新字符串[]{“长度”、“质量”、“体积”})还必须将模拟的上下文更改为@Mock(answer=Answers.RETURNS\u DEEP\u STUBS)私有上下文代码>因为我有一个链接存根。谢谢你的回复。我不确定我是否理解“doStuff thenReturn”部分。如果我忽略了这一部分(我可以吗?),我会在“unit=new unit(…)”行上得到一个NPE,这是由于setDimension()方法中的“String[]dimensions=ctx.getResources()…”引起的。我还尝试在init()中调用“MockitoAnnotations.initMocks(this);”,因为我在某些地方读到了这是必需的。如果使用@RunWith(MockitoJunitRunner.class)
则不需要MockitoAnnotations.initMocks(this)
2<代码>何时(context.doStuff())。然后返回(“stuff”)代码>显示了如何模拟与模拟对象的交互。在本例中,我假设您想要模拟一个名为doStuff()
的方法。看起来您希望在(context.getResources())时将其更改为代码>谢谢,这非常有帮助。我实际使用了when(context.getResources().getStringArray(R.array.dimensions_array)).thenReturn(新字符串[]{“长度”、“质量”、“体积”})还必须将模拟的上下文更改为@Mock(answer=Answers.RETURNS\u DEEP\u STUBS)私有上下文代码>因为我有一个链接存根。谢谢。你能不能说得更清楚一点,因为我只是个初学者?谢谢。你能不能说得更清楚一点,因为我只是个初学者?
import static org.mockito.Mockito.*;
@RunWith(MockitoJunitRunner.class)
public class UnitTest {
@Mock private Context context;
@Before
public void init() throws Exception {
when(context.doStuff()).thenReturn("stuff");
unit = new Unit("dm","length", (float) 0.1, context);
}
...