我一直在浏览Moq的plural sight教程。使用Arrange,act,assert的AAA主体,我成功地模拟了一个名为 GetDeviceSettingsForSerialNumber
的方法import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
public class MyPropertiesTest {
private MyProperties myProperties;
@Before
public void setup() {
myProperties = new MyProperties();
}
@Test
public void testMyProperties() {
assertNotNull(myProperties.getPropertyValue());
}
}
然而,在这一点上嘲笑一个稍微复杂的类型对我来说太难了,我正在寻求你的指导。
我正在测试的代码如下所示:
我开始尝试以下测试而没有运气:
[Test]
public void Interactions_should_be_called()
{
//arange
var mockConstructors = new Mock<IDeviceInteractions>();
mockConstructors.Setup(x => x.GetDeviceSettingsForSerialNumber(It.IsAny<string>()));
//Act
var sut = new Device("123",123);
sut.InitializeDeviceStatus();
sut.InitializeDeviceSettings();
//Assert
mockConstructors.Verify();
}
具体问题是如何模仿行为: [Test]
public void serviceDisposable_use_should_be_called()
{
//arange
var mockConstructors = new Mock<IWcfServiceProxy<PhysicianServiceContract>>();
mockConstructors.Setup(x =>
x.Use(It.IsAny < IWcfServiceProxy<PhysicianServiceContract>
.GetPatientDeviceStatus(It.IsAny<int>()) >));
//Act
var sut = new Device("123",123);
sut.InitializeDeviceStatus();
//Assert
mockConstructors.Verify();
}
如何模拟方法GetPatientDeviceStatus?
答案 0 :(得分:1)
查看方法new
中InitializeDeviceStatus
关键字的使用位置。这里因为new
使用了模拟是不可能的,因为实例是直接创建的。
而是尝试更改实现,以便可以以某种方式从外部注入您需要模拟的实例。这例如是完成的。通过构造函数注入或通过属性注入。或者该方法可以将WcfServiceProxy
的实例作为参数:
public void InitializeDeviceStatus(IWcfServiceProxy serviceDisposable)
{
try
{
DeviceStatus = serviceDisposable.Use(...);
}
}
然后在测试中将模拟注入测试方法:
[Test]
public void serviceDisposable_use_should_be_called()
{
//arange
...
// Inject the mock here
sut.InitializeDeviceStatus(mockConstructors.Object);
//Assert
...
}