嗨,我已经创建了一个类,它有一个返回字符串"HelloWorld"的方法
代码
public class Class1
{
public string GetHelloWorld()
{
return "HelloWorld";
}
}
我已经写了一个NUnit测试用例,想模拟这个方法的返回字符串,如下所示
public class UnitTest1
{
Mock<Class1> mock;
[Test]
public void TestMethod1()
{
string expected = "Hi";
mock.Setup(m => m.GetHelloWorld()).Returns(()=>"Hi");
Class1 obj = new Class1();
string x=obj.GetHelloWorld();
Assert.AreEqual("Hi", x);
}
}
当我使用Nunit运行时,我得到的错误是"对象引用未设置为对象的实例",第15行是mock.setup
谁能帮我解决这个问题,使这个单元测试通过。
谢谢你的帮助。
您还没有为模拟字段赋值。在您的测试中添加以下行:
Mock<Class1> mock = new Mock<Class1>()
无论如何你都不能模拟那个方法,因为它不是虚的。在一个不可重写的成员上无效的设置:x =>x.GetByTitle("asdf"
最后,您设置的行为仅适用于使用mock.Object
属性从mock中检索的实例,而不适用于Class1
的正常实例。所以如果你实例化一个new Class1()
,你不会得到模拟的行为。
public class Class1
{
public virtual string GetHelloWorld()
{
return "HelloWorld";
}
}
public class UnitTest1
{
[Test]
public void TestMethod1()
{
//arrange
Mock<Class1> mock = new Mock<Class1>();
mock.Setup(m => m.GetHelloWorld()).Returns(()=> "Hi");
Class1 obj = mock.Object;
//act
string x = obj.GetHelloWorld();
//assert
Assert.AreEqual("Hi", x);
}
}
我看不到任何Mock<Class1> mock = new Mock<Class1>()
。可能它丢失了,因此导致NullReferenceException。
其次,用Moq模拟非虚方法是不可能的。所以你的类应该是这样的。
public class Class1
{
public virtual string GetHelloWorld()
{
return "HelloWorld";
}
}
但我也不太确定你想做什么…当最终在实际实现中调用该方法时,为什么要设置模拟呢?