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

来源:互联网 发布:害怕异性亲密关系 知乎 编辑:程序博客网 时间:2024/05/16 17:36

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就能知道他所包含的所有接口。



原创粉丝点击