我有catch块,我想执行catch块。我的类文件是
public class TranscoderBean implements TranscoderLocal {
public byte[] encode(final Collection<?> entitySet) throws TranscoderException {
Validate.notNull(entitySet, "The entitySet can not be null.");
LOGGER.info("Encoding entities.");
LOGGER.debug("entities '{}'.", entitySet);
// Encode the Collection
MappedEncoderStream encoderStream = null;
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
try {
// Create the encoder and write the the DSE Logbook messgae
encoderStream = new MappedEncoderStream(outputStream, this.encoderVersion);
encoderStream.writeObjects(new ArrayList<Object>(entitySet), false);
encoderStream.flush();
}
catch (Exception e) {
LOGGER.error("Exception while encoding entities", e);
throw new TranscoderException("Failed to encode entities", e);
}
finally {
if (encoderStream != null) {
try {
encoderStream.close();
}
catch (IOException e) {
LOGGER.error("Exception while closing the endcoder stream.", e);
throw new TranscoderException("Failed to close encoder stream", e);
}
}
}
}
我的测试类文件是
public class TranscoderBeanTest {
private TranscoderBean fixture;
@Mock
MappedEncoderStream mappedEncoderStream;
@Test
public void encodeTest() throws TranscoderException {
List<Object> entitySet = new ArrayList<Object>();
FlightLog log1 = new FlightLog();
log1.setId("F5678");
log1.setAssetId("22");
FlightLog log2 = new FlightLog();
log2.setId("F5679");
log2.setAssetId("23");
entitySet.add(log1);
entitySet.add(log2);
MockitoAnnotations.initMocks(this);
try {
Mockito.doThrow(new IOException()).when(this.mappedEncoderStream).close();
Mockito.doReturn(new IOException()).when(this.mappedEncoderStream).close();
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
byte[] encode = this.fixture.encode(entitySet);
Assert.assertNotNull(encode);
}
}
我尝试过Mockito.doThrow和Mockito.docReturn方法,但仍然没有执行catch块。我做错了什么。
要测试try-catch块,可以使用TestNG方法,该方法包括实现具有以下注释expectedExceptions
的测试方法。这个方法的代码,你必须实现它才能引发这个异常,所以catch
块将被执行。
您可以查看http://testng.org/doc/documentation-main.html#annotations
您确定拥有正确的测试类吗。我在您的中没有看到任何对TranscoderBean的引用
您希望Mockito做一些它没有声称要做的事情:
Mockito.doThrow(new IOException()).when(this.mappedEncoderStream).close();
此语句断言,每当有人在映射器上调用close()
时,EncoderStream对象都将收到一个IOException
。你从来没有打过close
。
尝试在Mockito操作之后添加mapperEncoderStream.close();
,将输入catch块,但请注意:这对您的问题没有帮助,因为Mockito在这里没有帮助。
对于您的问题,您可以考虑以下替代方案:
重写
encoderStream = new MappedEncoderStream(outputStream, this.encoderVersion);
至
encoderStream = createMappedEncoderStream(outputStream);
MappedEncoderStream createMappedEncoderStream(ByteArrayOutputStream outputStream) {
return new MappedEncoderStream(outputStream, this.encoderVersion);
}
这样可以将mock作为依赖项注入。
然后像这样初始化你的修复程序:
fixture = new TranscoderBean() {
MappedEncoderStream createMappedEncoderStream(ByteArrayOutputStream outputStream) {
return mappedEncoderStream; //this is your mock
}
}
这将mock注入到您的TranscoderBean.encode方法中。
然后更改您的模拟注释:
@Mock(answer=CALLS_REAL_METHODS)
MappedEncoderStream mappedEncoderStream;
这是必要的,因为您的编码方法不仅在mappedEncoderStream
上调用close
,而且还调用writeObjects
和flush
。这些调用可能会抛出异常,因此必须对它们进行模拟,或者用对真实对象的调用来替换它们。
像一样修剪你的测试
@Test(expected=TranscoderException.class)
public void encodeTest() throws TranscoderException {
//... same as above
MockitoAnnotations.initMocks(this);
Mockito.doThrow(new IOException()).when(this.mappedEncoderStream).close();
this.fixture.encode(entitySet); //this will throw an exception
}
这会执行以下操作:
- 编码方法不返回CCD_ 12!它抛出一个
TranscoderException
,因此它被放置为expected
- 使用异常抛出重写
close
方法 - 呼叫编码