Java 如何为下面的方法编写JUnit测试?

Java 如何为下面的方法编写JUnit测试?,java,junit,Java,Junit,对不起。我是JUnit测试的新手 这是我的方法(我根本无法修改): 当getHalfValue()方法没有任何参数,但它从类变量中获取值时,如何为其编写测试?这将是一个有效的测试: @Test public void numberTest() { assertEquals(21, new HalfNumber().getHalfValue()); } 顺便说一句,这个课程的目的和设计是我见过的最糟糕的课程之一 大家好,谢谢你们的回复。这是我发现的解决上述问题的解决方案的一个快速提示,我希望

对不起。我是JUnit测试的新手

这是我的方法(我根本无法修改):


当getHalfValue()方法没有任何参数,但它从类变量中获取值时,如何为其编写测试?

这将是一个有效的测试:

@Test
public void numberTest() {
  assertEquals(21, new HalfNumber().getHalfValue());
}

顺便说一句,这个课程的目的和设计是我见过的最糟糕的课程之一

大家好,谢谢你们的回复。这是我发现的解决上述问题的解决方案的一个快速提示,我希望这适用于所有遇到类似情况的人,即在创建相应的测试类时无法修改java类:

public class TestHalfNumber {

private HalfNumber classUnderTest;

Map<String,Object> bindingsMap;

protected Map<String, String> captured;
@Mock
protected Resource resource;    
@Mock
protected ResourceResolver resourceResolver;
@Mock
protected SlingHttpServletRequest sServletReq;

// ---------------------------------------------------------------------------
/**
 * @param object
 *            of type WCMUsePojo. This object cannot be null.
 * @param map
 *            containing properties that needs to be initialized with
 *            WCMUsePojo
 */
// ---------------------------------------------------------------------------
public void init(WCMUsePojo obj, Map<String, Object> map) {
    Map<String, Object> staticMap = new HashMap<String, Object>();

    staticMap.put("resource", resource);

    staticMap.put("request", sServletReq);

    if (map != null)
        staticMap.putAll(map);

    if (obj != null)
        obj.init(new SimpleBindings(staticMap));
    else
        throw new IllegalArgumentException("Subclass object is null ");
}


@Before
public void setUp()
{
    MockitoAnnotations.initMocks(this); 
    classUnderTest = new HalfNumber();  
    when(sServletReq.getResourceResolver()).thenReturn(resourceResolver);   
}

// ---------------------------------------------------------------------------
/**
 * Test case for GetHalfValue 
 */
// ---------------------------------------------------------------------------
@Test
public void testGetHalfValue() throws Exception{

    int inputValue = 5;
    int expected = 3;

    bindingsMap = new HashMap<String,Object>();

    //Here is where we change the 4 by a 5 or any other value to test.
    bindingsMap.put("value",inputValue); 

    init(classUnderTest,bindingsMap);
    int result = classUnderTest.getHalfValue();
    Assert.assertEquals(expected,result);

    }

}
公共类TestHalfNumber{
私有半数类被测;
地图绑定;
截获的受保护地图;
@嘲弄
保护资源;
@嘲弄
受保护的ResourceResolver ResourceResolver;
@嘲弄
受保护的SlingHttpServletRequest sServletReq;
// ---------------------------------------------------------------------------
/**
*@param对象
*类型为WCMUsePojo。此对象不能为null。
*@param-map
*包含需要使用初始化的属性
*WCMUsePojo
*/
// ---------------------------------------------------------------------------
公共void init(WCMUsePojo对象,映射){
Map staticMap=newhashmap();
staticMap.put(“资源”,resource);
staticMap.put(“请求”,sServletReq);
if(map!=null)
staticMap.putAll(map);
如果(obj!=null)
obj.init(新的SimpleBindings(staticMap));
其他的
抛出新的IllegalArgumentException(“子类对象为null”);
}
@以前
公共作废设置()
{
initMocks(this);
classUnderTest=新的半数字();
当(sServletReq.getResourceResolver())。然后返回(resourceResolver);
}
// ---------------------------------------------------------------------------
/**
*GetHalfValue的测试用例
*/
// ---------------------------------------------------------------------------
@试验
public void testGetHalfValue()引发异常{
int输入值=5;
int预期=3;
bindingsMap=newhashmap();
//在这里,我们将4更改为5或任何其他值以进行测试。
bindingsMap.put(“值”,inputValue);
init(classUnderTest,bindingsMap);
int result=classUnderTest.getHalfValue();
Assert.assertEquals(预期,结果);
}
}

在正常执行中如何设置
?您好@nhouser9!!!此处的值是根据其他难以跟踪的操作定义的。(所以我假设数字是41,只是举个例子)对不起,我知道这个类很疯狂,但我没有写它们,也不能更改它们。但是假设这个值可以是任何整数,那么这个类是不可测试的,除非您使用反射来设置字段并测试各个方法。但这有点奇怪。您最好测试类的整个行为,但是如果编写时考虑了多个问题,那么这可能会很困难,而且可能不可能做到正确(如可测试的,但非常难看)。谢谢!!我已经有类似的东西了。当我注意到这个值(在本例中是41)是在这个巨大的方法之上的某个地方的一些其他计算的结果时,我的问题就开始了(我同意这很可怕,但我没有编写它,我不能更改它,我的工作只是在这里介绍Java单元测试)。所以,我的下一个问题是如何在类中直接模拟该变量的值?在您的解决方案中,21总是结果,我想直接从测试类设置一个值。要么有一个方法更改“value”属性,要么您需要通过反射API访问它。但目的是什么?由于类被设计为具有固定的“value”属性,因此尝试强制更改它是没有意义的。
public class TestHalfNumber {

private HalfNumber classUnderTest;

Map<String,Object> bindingsMap;

protected Map<String, String> captured;
@Mock
protected Resource resource;    
@Mock
protected ResourceResolver resourceResolver;
@Mock
protected SlingHttpServletRequest sServletReq;

// ---------------------------------------------------------------------------
/**
 * @param object
 *            of type WCMUsePojo. This object cannot be null.
 * @param map
 *            containing properties that needs to be initialized with
 *            WCMUsePojo
 */
// ---------------------------------------------------------------------------
public void init(WCMUsePojo obj, Map<String, Object> map) {
    Map<String, Object> staticMap = new HashMap<String, Object>();

    staticMap.put("resource", resource);

    staticMap.put("request", sServletReq);

    if (map != null)
        staticMap.putAll(map);

    if (obj != null)
        obj.init(new SimpleBindings(staticMap));
    else
        throw new IllegalArgumentException("Subclass object is null ");
}


@Before
public void setUp()
{
    MockitoAnnotations.initMocks(this); 
    classUnderTest = new HalfNumber();  
    when(sServletReq.getResourceResolver()).thenReturn(resourceResolver);   
}

// ---------------------------------------------------------------------------
/**
 * Test case for GetHalfValue 
 */
// ---------------------------------------------------------------------------
@Test
public void testGetHalfValue() throws Exception{

    int inputValue = 5;
    int expected = 3;

    bindingsMap = new HashMap<String,Object>();

    //Here is where we change the 4 by a 5 or any other value to test.
    bindingsMap.put("value",inputValue); 

    init(classUnderTest,bindingsMap);
    int result = classUnderTest.getHalfValue();
    Assert.assertEquals(expected,result);

    }

}