我是单元测试的新手,所以如果这是一个noob-question,请原谅我:
我试图测试一个功能:
<TestMethod>
Public Sub CheckSomethingTest()
Dim testObject as new MyClass()
Assert.IsTrue(testObject.CheckSomething(), "Check failed")
End Sub
MyClass.CheckSomething 函数正在访问正在进行数据库查询的全局共享方法。
Public Function CheckSomething() as Boolean
Dim length as Integer = GlobalModule.GetLegthFromDb()
Return length > 0
End Function
GlobalModule 的内容:
Public Class GlobalModule
Public Shared Function GetLegthFromDb() As Integer
'pretend database is not available
Throw New InstanceNotFoundException("DB Connetion not set")
End Function
End Class
由于数据库不可用于测试,我得到Nullpointer异常。
有没有办法模拟(或其他) GetLegthFromDb 方法进行测试?
答案 0 :(得分:1)
GlobalModule
需要在类中注入,当您实例化您尝试测试的类时,可以在该类中注入GlobalModule
的模拟。将界面连接起来也更好。
代码在C#中,因为它对我来说更容易,但您可能很容易翻译它。
public class MyClass()
{
IGlobalModule _globalModule;
public MyClass (IGlobalModule globalModule)
{
_globalModule = globalModule; // use this in the method
}
public bool CheckSomething()
{
return _globalModule.GetLegthFromDb() > 0;
}
}
进行测试:
var mock = new Mock<IGlobalModule>();
mock.SetUp(m=>m.GetLegthFromDb()).Returns(100);//whatever you want to return
var testObject = new MyClass(mock.Object);
Assert.IsTrue(testObject.CheckSomething(), "Check failed")
答案 1 :(得分:0)
经过一些额外的研究后,我找到了符合我要求的解决方案:
我使用Microsoft Fakes来模拟共享函数。
<TestMethod>
Public Sub CheckSomethingTest()
Using s = Microsoft.QualityTools.Testing.Fakes.ShimsContext.Create()
MockTest.Fakes.ShimGlobalModule.GetLegthFromDb = Function() As Integer
Return 111
End Function
Dim testObject As New MyClassA
Assert.IsTrue(testObject.CheckSomething(), "Check failed")
End Using
End Sub
MockTest 是我项目的命名空间。