构造函数中的异常:Rhino.Mocks.Exceptions.ExpectationViolationException:期望#0,实际#1

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了构造函数中的异常:Rhino.Mocks.Exceptions.ExpectationViolationException:期望#0,实际#1相关的知识,希望对你有一定的参考价值。

我为这个构造函数做了一个有效的Rhino Mock测试

    public MyClassDataAccess(IMyClassLogger logger)
    
        _logger = logger ?? throw new ArgumentNullException("logger");
    

这是测试

    [TestMethod]
    public void Ctor_ValidParams_CreatesObject()
    
        // Arrange
        IMyClassLogger logger = MockRepository.GenerateStrictMock<IMyClassLogger>();
        // Act
        var result = new MyClassDataAccess(logger);

        // Assert
        Assert.IsNotNull(result);
    

然后我修改了构造函数

    public MyClassDataAccess(IMyClassLogger logger)
    
        _logger = logger ?? throw new ArgumentNullException("logger");
        _database = new Database(_logger.BaseLogger);
    

    public Database(ILogger logger)
    
        _logger = logger ?? throw new ArgumentException(nameof(logger));
        _databaseNameConnectionString = ConfigurationManager.ConnectionStrings["DatabaseName"].ConnectionString;
    

现在我收到以下错误

消息:初始化方法MyClass.Tests.DataAccess.MyClassDataAccessTests.TestInit引发异常。 System.Exception:System.Exception:构造函数中的异常:Rhino.Mocks.Exceptions.ExpectationViolationException:IMyClassLogger.get_BaseLogger();预期#0,实际#1。

答案

抛出异常是因为您在严格模拟上调用了成员

IMyClassLogger logger = MockRepository.GenerateStrictMock<IMyClassLogger>(); //<-- Strict Mock here

没有预期的定义。

你在调用

_database = new Database(_logger.BaseLogger);

在构造函数中但没有创建任何期望它被调用,所以你在ExpectationViolationException上得到IMyClassLogger.get_BaseLogger(),如异常消息中所述

您需要为该成员设置期望

[TestMethod]
public void Ctor_ValidParams_CreatesObject()

    // Arrange
    ILogger baseLogger =  MockRepository.GenerateMock<ILogger>();
    IMyClassLogger logger = MockRepository.GenerateStrictMock<IMyClassLogger>();
    logger.Stub(_ => _.BaseLogger).Return(baseLogger);

    // Act
    var result = new MyClassDataAccess(logger);

    // Assert
    Assert.IsNotNull(result);

以上是关于构造函数中的异常:Rhino.Mocks.Exceptions.ExpectationViolationException:期望#0,实际#1的主要内容,如果未能解决你的问题,请参考以下文章

使用构造函数注入的弹簧@RestController中的空异常@Service

构造函数中的异常:Rhino.Mocks.Exceptions.ExpectationViolationException:期望#0,实际#1

线程“主”javax.persistence.PersistenceException 中的异常:org.hibernate.InstantiationException:实体没有默认构造函数:[重复

构造函数中的变量初始化速度不够快,无法防止 html 代码中的空指针异常 [Angular]

从默认构造函数中添加静态类中的实例类时出现Stack-Overflow异常

Java面试题总结