Spock嘲笑显示为空值 [英] Spock mocks showing up as nulls

查看:215
本文介绍了Spock嘲笑显示为空值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



  @ Slf4j 
类ConsoleReaderWorker实现Runnable {
ConsoleReader reader
Writer书写器
RemoteCommandSelector commandSelector
$ b @Inject
ConsoleReaderWorker(ConsoleReader读写器,Writer写入器,RemoteCommandSelector commandSelector){
super()
this .reader = reader
this.writer = writer
this.commandSelector = commandSelector
}

@Override
void run(){
尝试{
String line
while((line = reader.readLine())!= null){
commandSelector.select(line).execute(writer)
writer.flush ()
}
} catch(InterruptedException ex){
log.warn($ {this} interrupt with:$ {ExceptionUtils.getStackTrace(ex)})
}
}
}

这是我的尝试这个类的Spock Specification :

 类ConsoleReaderWorkerSpec extends Specification {
def当输入键被按下,然后选择并执行一个命令并且写入器被刷新(){
给出:一个具有一些模拟依赖关系的运行夹具
ConsoleReader reader = Mock ConsoleReader)
Writer writer = Mock(Writer)
RemoteCommand command = Mock(RemoteCommand)
RemoteCommandSelector commandSelector = Mock(RemoteCommandSelector)

reader.readLine()> > '\\\
'
commandSelector.select(_)>>命令

ConsoleReaderWorker worker =新的ConsoleReaderWorker(读取器,写入器,commandSelector)

当:enter key is pressed时
worker.run()

then:a command is executed
1 * commandSelector.select(_)
}
}

基本上,我想确认当调用 run()方法时, commandSelector#select()方法是用任何参数调用的。

当我运行这个时, / p>

  java.lang.NullPointerException:无法在com.nocbots.nbsvc.remote的null对象
上调用方法execute() .cli.jline.ConsoleReaderWorker.run(ConsoleReaderWorker.groovy:33)
在com.nocbots.nbsvc.remote.cli.jline.ConsoleReaderWorkerSpec.when按下输入键,然后选择并执行一个命令,刷新(ConsoleReaderWorkerSpec.groovy:25)

33行o f ConsoleReadyWorker 是对 commandSelector.select()的调用,它位于内部, code> loop:

  commandSelector.select(line).execute(writer)

关于为什么?!?的任何想法正如你所看到的,我已经连接 commandSelector#select() mock来返回 RemoteCommand 模拟,所以它应该从来没有空...想法?

解决方案

尝试:

 然后:执行一个命令
1 * commandSelector.select(_)>>命令

而不是:

  commandSelector.select(_)>>命令

请查看文档。当你同时进行模拟和验证时,应该使用然后使用块。
$ b 编辑



这是你得到的spock相关错误,相信我。看看下面的runnable脚本(可以使用groovy控制台运行):

  @Grab('org.spockframework:spock -core:1.0-groovy-2.4')
@Grab('cglib:cglib-nodep:3.1')

import spock.lang。*

class ConsoleReaderWorkerSpec扩展了规格{
def,当输入键被按下,然后选择并执行一个命令并且写入器被刷新(){
给定:一个具有一些模拟依赖关系的运行夹具
ConsoleReader reader = Mock(ConsoleReader)
Writer writer = Mock(Writer)
RemoteCommand command = Mock(RemoteCommand)
RemoteCommandSelector commandSelector = Mock(RemoteCommandSelector)

reader。 readLine()>> '\\\
'

ConsoleReaderWorker worker = new ConsoleReaderWorker(reader,writer,commandSelector)

当:enter key is pressed时
worker.run )

然后:执行命令
1 * commandSelector.select(_)>>命令



类ConsoleReaderWorker实现Runnable {

ConsoleReader reader
Writer编写器
RemoteCommandSelector commandSelector

ConsoleReaderWorker(ConsoleReader reader,Writer writer,RemoteCommandSelector commandSelector){
this.reader = reader
this.writer = writer
this.commandSelector = commandSelector
} $ b $()$!
@Override
void run(){
try {
String line
while((line = reader.readLine())!= null){
commandSelector.select(line).execute(writer)
writer.flush()
}
} catch(InterruptedException ex){
log.warn($ { {} Exception {} {$ ExceptionUtils.getStackTrace(ex)})
}
}
}
class Writer {
void flush(){}

class RemoteCommand {
void execute(Writer w){


$ b class ConsoleReader {
String readLine(){
''
}
}
类RemoteCommandSelector {
RemoteCommand select(o){
new RemoteCommand()
}
}

由于 select 被调用两次,但不会因NPE而失败。要修复它,请添加以下行:

  reader.readLine()>>> ['\\\
',null]


Here is my main class:

@Slf4j
class ConsoleReaderWorker implements Runnable {
    ConsoleReader reader
    Writer writer
    RemoteCommandSelector commandSelector

    @Inject
    ConsoleReaderWorker(ConsoleReader reader, Writer writer, RemoteCommandSelector commandSelector) {
        super()
        this.reader = reader
        this.writer = writer
        this.commandSelector = commandSelector
    }

    @Override
    void run() {
        try {
            String line
            while ((line = reader.readLine()) != null) {
                commandSelector.select(line).execute(writer)
                writer.flush()
            }
        } catch(InterruptedException ex) {
            log.warn("${this} interrupted with: ${ExceptionUtils.getStackTrace(ex)}")
        }
    }
}

Here is my attempt at a Spock Specification for that class:

class ConsoleReaderWorkerSpec extends Specification {
    def "when enter key is pressed then a command is selected and executed and the writer is flushed"() {
        given: "a running fixture with some mock dependencies"
        ConsoleReader reader = Mock(ConsoleReader)
        Writer writer = Mock(Writer)
        RemoteCommand command = Mock(RemoteCommand)
        RemoteCommandSelector commandSelector = Mock(RemoteCommandSelector)

        reader.readLine() >> '\n'
        commandSelector.select(_) >> command

        ConsoleReaderWorker worker = new ConsoleReaderWorker(reader, writer, commandSelector)

        when: "the enter key is pressed"
        worker.run()

        then: "a command is executed"
        1 * commandSelector.select(_)
    }
}

Essentially, I want to confirm that when the run() method is invoked, that the commandSelector#select() method is invoked with any argument.

When I run this I get:

java.lang.NullPointerException: Cannot invoke method execute() on null object
    at com.nocbots.nbsvc.remote.cli.jline.ConsoleReaderWorker.run(ConsoleReaderWorker.groovy:33)
    at com.nocbots.nbsvc.remote.cli.jline.ConsoleReaderWorkerSpec.when enter key is pressed then a command is selected and executed and the writer is flushed(ConsoleReaderWorkerSpec.groovy:25)

Line 33 of ConsoleReadyWorker is the call to commandSelector.select() that lives inside the while loop:

commandSelector.select(line).execute(writer)

Any ideas as to why?!? As you can see, I've wired commandSelector#select() mock to return the RemoteCommand mock, so it should never be null...ideas?

解决方案

Try:

then: "a command is executed"
1 * commandSelector.select(_) >> command

instead of:

commandSelector.select(_) >> command

Please have a look at the docs. When you both mock and verify, then block should be used.

EDIT

This is spock related error you're getting, trust me. Have a look at the runnable script below (can be run using groovy console):

@Grab('org.spockframework:spock-core:1.0-groovy-2.4')
@Grab('cglib:cglib-nodep:3.1')

import spock.lang.*

class ConsoleReaderWorkerSpec extends Specification {
    def "when enter key is pressed then a command is selected and executed and the writer is flushed"() {
        given: "a running fixture with some mock dependencies"
        ConsoleReader reader = Mock(ConsoleReader)
        Writer writer = Mock(Writer)
        RemoteCommand command = Mock(RemoteCommand)
        RemoteCommandSelector commandSelector = Mock(RemoteCommandSelector)

        reader.readLine() >> '\n'

        ConsoleReaderWorker worker = new ConsoleReaderWorker(reader, writer, commandSelector)

        when: "the enter key is pressed"
        worker.run()

        then: "a command is executed"
        1 * commandSelector.select(_) >> command
    }
}

class ConsoleReaderWorker implements Runnable {

    ConsoleReader reader
    Writer writer
    RemoteCommandSelector commandSelector

    ConsoleReaderWorker(ConsoleReader reader, Writer writer, RemoteCommandSelector commandSelector) {
        this.reader = reader
        this.writer = writer
        this.commandSelector = commandSelector
    }

    @Override
    void run() {
        try {
            String line
            while ((line = reader.readLine()) != null) {
                commandSelector.select(line).execute(writer)
                writer.flush()
            }
        } catch(InterruptedException ex) {
            log.warn("${this} interrupted with: ${ExceptionUtils.getStackTrace(ex)}")
        }
    }
}
class Writer {
   void flush() {}
}
class RemoteCommand {
   void execute(Writer w) {

   }
}
class ConsoleReader {
   String readLine() {
      ''
   }
}
class RemoteCommandSelector {
   RemoteCommand select(o) {
      new RemoteCommand()
   }
}

It fails since select is invoked twice, but does not fail with NPE. To fix it add the following line:

reader.readLine() >>> ['\n', null]

这篇关于Spock嘲笑显示为空值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆