Moq测试基础说谈(四)——Mock类,创建对象,实用工厂

简介: Mock Class 定义为:   public class Mock : Mock where T : class   这的构造方法: Mock() Mock(MockBehavior) Mock(array[]) Mock(MockBehavior, array[])   Mock的泛型实现类,它有很多方法和属性。

Mock<T> Class

定义为:

 

public class Mock<T> : Mock

where T : class

 

这的构造方法:

Mock<T>()

Mock<T>(MockBehavior)

Mock<T>(array<Object>[])

Mock<T>(MockBehavior, array<Object>[])

 

Mock的泛型实现类,它有很多方法和属性。这里一一列举。

(一)方法

(1)As<TInterface>方法

mock添加接口实现(mock),可以给它指定设置。

mock对象的属性(或方法)首次使用之前才有效。且,参数只能是接口。

定义:

public virtual Mock<TInterface> As<TInterface>()

where TInterface : class

 

示例:

两个接口:

其中的Icustomer接口还是前几篇中用到的,这里添加一个Iorder接口:

public interface IOrder

{

string ShowTitle(string str);

}

 

Mock测试:

var customer = new Mock<ICustomer>();

 

customer.Setup(p => p.GetCall()).Returns("方法调用");

 

customer.Object.GetCall();

var order=customer.As<IOrder>();

order.Setup(p => p.ShowTitle(It.IsAny<string>())).Returns("ok");

Assert.AreEqual("ok",order.Object.ShowTitle(""));

 

这个将出现异常,因为在As之前,已经对GetCall进行了调用。

 

(2)SetUp方法

为模拟的对象中的方法指定设置,它有两个重载:

Setup(Expression<Action<T>>)

Setup<TResult>(Expression<Func<T,TResult>>)

 

从两个委托可以知道,这两个一个是为没有返回值的方法设置,一个是对有返回值的方法设置

public void TestSetUp()

{

var customer = new Mock<ICustomer>();

 

    customer.Setup(p => p.AddCall())

.Callback(()=>Console.WriteLine("没有返回值"));

 

    customer.Setup(p => p.GetCall(It.IsAny<string>()))

.Returns("ok")

.Callback((string q) => Console.WriteLine("有返回值"));

 

    customer.Object.AddCall();

    customer.Object.GetCall("");

}

这个前几篇已经广泛使用。

(3) 其它方法略

 其它内容可见:

http://www.cnblogs.com/jams742003/archive/2010/03/02/1676585.html

现在看一下Mock的一个构造器:

Mock<T>(MockBehavior),定义:

 

public Mock(MockBehavior behavior)

 

MockBehavior类是自定义mock行为的枚举:

Strict mock对象没有合适的设置时,总是抛出异常

Loose 从不抛出异常,如果必要会返回默认值(引用类型为null,值类型为0,或枚举和数组为空)

Default mock行为默认值,就是Loose

 

接口:

public interface IOrder

{

string ShowTitle(string str);

string ShowAddress();

 

}

 

测试:

public void TestBehivor()

{

    var order = new Mock<IOrder>();

    order.Object.ShowTitle(string.Empty);

}

 

这个接口有两个方法,在测试里,创建了mock对象,然后调用它的一个方法:ShowTitle

但在之前,这个方法并没有被设置,这时mock对象的默认行为为Default,也就是Loose,所以不会出现异常。

当把mock对象的行为设置为严格后:

var order = new Mock<IOrder>(MockBehavior.Strict);

order.Object.ShowTitle(string.Empty);

 

测试就会出错:IOrder.ShowTitle("") invocation failed with mock behavior Strict.

 

Mock的名字空间中还有一个MockFactory类,是一个用于构造多个mock对象的功能工厂

它有三个方法:

CreateVerifyVerifyAll

Create的方法有:

Create<T>()

Create<T>(MockBehavior)

Create<T>(array<Object>[])

Create<T>(MockBehavior,array<Object>[])

 

其中Create<T>(array<Object>[])定义:

public Mock<T> Create<T>(

    params Object[] args

) where T : class

 

它会根据参数来确定合适的被Mock的对象的构造器。

 

博客园大道至简

http://www.cnblogs.com/jams742003/

转载请注明:博客园

目录
相关文章
|
3月前
|
消息中间件 Java 数据库
【消息队列开发】 实现 VirtualHostTests 类——测试虚拟主机操作
【消息队列开发】 实现 VirtualHostTests 类——测试虚拟主机操作
|
4月前
Mybatis+mysql动态分页查询数据案例——测试类HouseDaoMybatisImplTest)
Mybatis+mysql动态分页查询数据案例——测试类HouseDaoMybatisImplTest)
|
4月前
|
算法 测试技术 C++
【矩阵快速幂】封装类及测试用例及样例
【矩阵快速幂】封装类及测试用例及样例
|
4月前
|
Java
【Java每日一题】— —第二十一题:编程把现实生活的手机事物映射成一个标准类Phone,并定义一个测试类PhoneDemo测试Phone类的功能
【Java每日一题】— —第二十一题:编程把现实生活的手机事物映射成一个标准类Phone,并定义一个测试类PhoneDemo测试Phone类的功能
|
3月前
|
消息中间件 存储 测试技术
【消息队列开发】 实现MemoryDataCenterTests类——测试管理内存数据
【消息队列开发】 实现MemoryDataCenterTests类——测试管理内存数据
|
30天前
|
JSON 测试技术 数据格式
单元测试问题之使用JCode5插件生成测试类如何解决
单元测试问题之使用JCode5插件生成测试类如何解决
59 3
|
30天前
|
Java 测试技术 Spring
单元测试问题之在 JCode5 类中使用 testService如何解决
单元测试问题之在 JCode5 类中使用 testService如何解决
11 2
|
2月前
|
测试技术
详解单元测试问题之MockHandlerImpl类的handle方法中VerificationMode不为空如何解决
详解单元测试问题之MockHandlerImpl类的handle方法中VerificationMode不为空如何解决
38 3
|
2月前
|
Java 数据库 Spring
Java编程问题之在测试中使用CGLIB创建代理类如何解决
Java编程问题之在测试中使用CGLIB创建代理类如何解决
|
3月前
|
JavaScript Java 测试技术
《手把手教你》系列技巧篇(七十一)-java+ selenium自动化测试-自定义类解决元素同步问题(详解教程)
【6月更文挑战第12天】本文介绍了如何创建一个自定义类库来解决自动化测试中的元素同步问题。作者指出,大部分错误源于元素因时间不同步而引发,为此提供了一种解决方案。在项目实践中,首先在`library`包下创建名为`MyWait`的类,包含一个方法`isElementPresent`,该方法通过循环尝试并等待指定元素出现,避免了直接使用时间等待可能导致的不准确性。之后,在测试类中调用此自定义方法,成功实现了元素同步。代码示例展示了如何在Java+Selenium自动化测试中应用这个自定义类。
52 2