我已经完成了代码,并且所有测试用例都给了我正确的除了两个数组为空的情况,并且应该抛出一个运行时异常,并显示消息“空数组没有模式”。我的测试失败说:空输入应该产生一个RuntimeExcetpion,消息“空数组没有模式”。我已将其包含在代码中,但仍未通过这些测试用例。其中一个测试用例是:
@Test(timeout=2000) public void mode_empty1(){
String msg;
String expect = "Empty array has no mode";
try{
Mode.mode(new String[]{});
}
catch(RuntimeException e){
String actual = e.getMessage();
msg = String.format("\nRuntimeException has wrong message\nExpect: %s\nActual: %s\n",
expect,actual);
assertEquals(msg,expect,actual);
return;
}
msg = String.format("\nEmpty input should yield a RuntimException with message '%s'\n",
expect);
fail(msg);
}
Coulb smb请帮帮忙?
public class Mode {
public static <T> Pair<T, Integer> mode(T items[])
{
try
{
if(items == null) throw new RuntimeException("Empty array has no mode");
else
{
T element = items[0];
int count = 0;
for(int i = 0; i < items.length; i++)
{
int tempCount = 0;
T tempElement = items[i];
for(int j = 0; j < items.length; j++)
{
if(tempElement.equals(items[j]))
tempCount++;
}
if(tempCount > count)
{
count = tempCount;
element = tempElement;
}
}
return new Pair<T, Integer>(element, new Integer(count));
}
}
catch(RuntimeException e)
{
System.out.println(e.getMessage());
}
return null;
}
}
答案 0 :(得分:0)
条件if(items == null)
测试数组是null
,而不是它是否为空。但是当你执行Mode.mode(new String[]{})
时,你传递的是一个空数组,而不是null
。
您可以通过执行以下操作来检查空数组:
if(items == null || items.length == 0) throw new RuntimeException("Empty array has no mode");
或者将null
传递给Mode.mode()
:
Mode.mode(null)
由于您想要抓住RuntimeException
以外的mode()
try-catch
,您不再需要public static <T> Pair<T, Integer> mode(T items[]) {
if (items == null || items.length == 0) {
throw new RuntimeException("Empty array has no mode");
} else {
T element = items[0];
int count = 0;
for(int i = 0; i < items.length; i++) {
int tempCount = 0;
T tempElement = items[i];
for(int j = 0; j < items.length; j++) {
if (tempElement.equals(items[j])) {
tempCount++;
}
}
if (tempCount > count) {
count = tempCount;
element = tempElement;
}
}
return new Pair<T, Integer>(element, new Integer(count));
}
return null;
}
区块了:
{{1}}
答案 1 :(得分:0)
您的生产代码会检查空输入,但您的测试代码会传入非空输入。
您应该更改测试代码以传入空输入:
Mode.mode(null);
或将生产代码中的条件更改为:
if(items.length == 0) throw ...
您可能想要检查生产代码中的无效和空白:
if(items == null || items.length == 0) throw ...
您还需要在try
块之前移动此检查,因为您正在立即捕获抛出的异常。
if(items == null) throw new RuntimeException("Empty array has no mode");
try {
...
} catch (RuntimeException e) {
...
}