JMockit学习笔记(二,mocked类型)

Declaring and using mocked types

一个mock类型可以通过一个实例field或者一个参数声明来传入。对于第一种情况,这个field是属于测试类或者mockit.Expectations的子类(在某个expectation中的一个本地field)。对于第二种情况,该参数必须术语一个测试方法。

在所有的情况下,一个mock的field/parameter声明必须使用mockit.Mocked注释(@Mocked)。在expectation模块中,对于mockfield/parameter,是否使用该注释是可选的。只有当mock field在测试类中声明时,该注释(或者其他注释如@NonStrict)才是必须的。这个为了防止在测试类中有其他field不需要mock而产生冲突。

对于mockfields和parameters来说,所有种类的java类型都是有效的,除了primitive类型和数组类型。因此下面这些类型都是有效的:interfaces,concrete classes,abstract classes,finalclasses,enum types,和annotationtypes。包括了JRE中的类型(如java.lang ,java.util中的类)。

对于一个在测试方法中声明的mock parameter,JMockit会自动为其创建一个实例,并且在该测试方法被调用时由JUnit/TestNGtest runner传入。因此该parameter永远不会为null。

对于一个mock field,JMockit不会自动为其创建一个实例并传给该field(final field除外)。在这种场景中,(finalfiled除外)。这是需要在测试代码中显示的创建并给field赋值。该值可能为null。

Mockedinstances

有JMockit创建的mocked实例可以在测试代码中正常使用。也可以将其传递给被测试的对象。当然也可以不使用。默认情况下,JMockit不关心mock实例被谁调用。使得在被测试代码中进行new操作时,可以直接来创建类的实例。这些类必须包含在测试代码中的mock类型中。

   

Mockingmultiple interfaces at the same time

假设被测试的代码中需要一个实现了两个或多个接口的对象。那我们是否能得到满足这些条件的mocked实例。

一种方法是,写一个test-specific的接口继承测试代码中需要的所有接口。然后将其作为mock类型来使用。

但一个更好的方法如下,该方法并不需要定义一个新的接口。

public interface Dependency // an arbitrary custom interface
{
   String doSomething(boolean b);
}

public final class MultiMocksTest<MultiMock extends Dependency & Runnable>
{
   @Mocked MultiMock multiMock;

   @Test
   public void mockFieldWithTwoInterfaces()
   {
      new NonStrictExpectations() {{
         multiMock.doSomething(false); result = "test";
      }};

      multiMock.run();
      assertEquals("test", multiMock.doSomething(false));

      new Verifications() {{ multiMock.run(); }};
   }

   @Test
   public <M extends Dependency & Serializable> void mockParameterWithTwoInterfaces(final M mock)
   {
      new Expectations() {{
         mock.doSomething(true); result = ""
      }};

      assertEquals("", mock.doSomething(true));
   }
}

在上面任意一个测试方法中,两个接口都会同时被mock:

一个mock field 中的Dependency 和java.lang.Runnable

 一个mockparameter中的Dependency和java.io.Serializable

当我们使用MultiMockM型的变量时,JMockit就能知道他所包含的所有接口。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值