Как я могу заставить PHPUnit MockObjects возвращать различные значения на основе параметра?

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

Например, ниже - класс ученика, который будет использовать его в нашем коде.

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
128
задан thanksd 3 August 2016 в 20:57
поделиться

5 ответов

Используйте обратный вызов. например, (прямо из документации PHPUnit):

<?php
class StubTest extends PHPUnit_Framework_TestCase
{
    public function testReturnCallbackStub()
    {
        $stub = $this->getMock(
          'SomeClass', array('doSomething')
        );

        $stub->expects($this->any())
             ->method('doSomething')
             ->will($this->returnCallback('callback'));

        // $stub->doSomething() returns callback(...)
    }
}

function callback() {
    $args = func_get_args();
    // ...
}
?>

Делают любую обработку, Вы хотите в обратном вызове () и возвращаете результат на основе своего $args как соответствующий.

114
ответ дан 24 November 2019 в 00:36
поделиться

Вы имеете в виду что-то вроде этого?

public function TestSomeCondition($condition){
  $mockObj = $this->getMockObject();
  $mockObj->setReturnValue('yourMethod',$condition);
}
0
ответ дан 24 November 2019 в 00:36
поделиться

У меня была подобная проблема, которую я не мог разработать также (существует удивительно мало информации о для PHPUnit). В моем случае я просто сделал каждый тест отдельным тестом - известный вход и известный вывод. Я понял, что не должен был делать фиктивный объект мастера на все руки, мне только был нужен определенный для определенного теста, и таким образом я выделил тесты и могу протестировать отдельные аспекты моего кода как отдельная единица. Я не уверен, могло ли это быть применимо к Вам или нет, но это до того, что необходимо протестировать.

0
ответ дан 24 November 2019 в 00:36
поделиться

Попробуйте:

->with($this->equalTo('one'),$this->equalTo('two))->will($this->returnValue('return value'));
-2
ответ дан 24 November 2019 в 00:36
поделиться

Нельзя создать ссылку «следуй за нами!». Вы можете использовать Twitter API для создания ссылки, что при нажатии делает правильный POST вызов API, но нет способа получить простую ссылку, как вы просили.

-121--2949028-

В Java нельзя явно указать порядковые значения для . Они всегда авторецендируют, начиная с 0, без контроля над ним.

Если нужны другие пользовательские значения, их необходимо поместить в вызовы конструктора и сохранить самостоятельно. Вы можете получить автореценцию, но это не так просто:

import java.util.EnumSet;

// Please don't ever use this code. It's here so you can point and laugh.
enum Foo 
{ 
    A(10), B, C, D(5000), E, Fish;

    private static int nextValue;
    private int value;

    private Foo()
    {
        this(Counter.nextValue);
    }

    private Foo(int value)
    {
        this.value = value;
        Counter.nextValue = value + 1;
    }

    public int getValue() 
    {
        return value;
    }

    private static class Counter
    {
        private static int nextValue = 0;
    }
}

public class Test
{
    public static void main(String[] args)
    {
        for (Foo foo : EnumSet.allOf(Foo.class))
        {
            System.out.println(foo.name() + " " + 
                               foo.ordinal() + " " + 
                               foo.getValue());
        }
    }
}

Обратите внимание на необходимость вложенного класса, потому что вы не можете получить доступ к статическим полям в конструкторе перечисления. Икк, икк, икк. Пожалуйста, не делай этого.

-121--3823408-

У меня была похожая проблема (хотя и немного другая... Я не нуждался в другом возвращаемом значении на основе аргументов, но должен был проверить, чтобы убедиться, что 2 набора аргументов передаются одной и той же функции). Я наткнулся на использование чего-то подобного:

$mock = $this->getMock();
$mock->expects($this->at(0))
    ->method('foo')
    ->with(...)
    ->will($this->returnValue(...));

$mock->expects($this->at(1))
    ->method('foo')
    ->with(...)
    ->will($this->returnValue(...));

Это не идеально, так как требует, чтобы порядок 2 вызовов foo () был известен, но на практике это, вероятно, не слишком плохо.

46
ответ дан 24 November 2019 в 00:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: