解耦思路
- 接口定义:为
DataAccess
类创建一个接口 IDataAccess
,定义 DataAccess
类中会被 MyService
使用到的方法。
- 依赖注入:在
MyService
类中通过构造函数或者属性注入的方式,接收 IDataAccess
接口的实例,而不是直接实例化 DataAccess
类。这样在单元测试时,可以传入模拟实现了 IDataAccess
接口的对象,从而解耦 MyService
与 DataAccess
的依赖关系,实现对 MyService
的独立测试。
示例代码
- 定义接口
Public Interface IDataAccess
Function GetData() As String
End Interface
- 实现数据访问类
Public Class DataAccess
Implements IDataAccess
Public Function GetData() As String Implements IDataAccess.GetData
'实际从数据库等数据源获取数据的逻辑
Return "Actual data from data source"
End Function
End Class
- 服务类
Public Class MyService
Private _dataAccess As IDataAccess
'构造函数注入
Public Sub New(ByVal dataAccess As IDataAccess)
_dataAccess = dataAccess
End Sub
Public Function ProcessData() As String
Dim data = _dataAccess.GetData()
'对获取到的数据进行处理
Return "Processed: " & data
End Function
End Class
- 单元测试(假设使用 NUnit 框架)
Imports NUnit.Framework
Public Class MyServiceTests
<Test>
Public Sub TestProcessData()
'创建模拟数据访问对象
Dim mockDataAccess As New MockDataAccess()
Dim myService As New MyService(mockDataAccess)
Dim result = myService.ProcessData()
Assert.AreEqual("Processed: Mock data", result)
End Sub
End Class
'模拟数据访问类
Public Class MockDataAccess
Implements IDataAccess
Public Function GetData() As String Implements IDataAccess.GetData
Return "Mock data"
End Function
End Class