Я могу дразнить вызов метода суперкласса?

Поскольку вы указываете поле, которое не существует во всех документах вашего .sort(), тогда там, где оно отсутствует, значение считается null, что, конечно, имеет более низкий порядок и, следовательно, более высокий приоритет в отсортированном чем любое другое значение.

Единственный способ изменить этот ответ состоит в том, чтобы по существу «спроектировать» более высокое значение, из которого можно сортировать, чем другой ожидаемый диапазон значений, чтобы эти результаты упали до конца другие результаты. Такие «взвешенные» запросы с прогнозируемым значением требуют метода .aggregate() :

db.collection.aggregate([
    { "$project": {
        "name": 1,
        "bids": 1,
        "sortfield": { "$ifNull": [ "$bids", 999999 ] }
    }},
    { "$sort": { "sortfield": 1 } }
])

Используется $project и $sort , чтобы получить результат в желаемом порядке. Сначала выполните операцию $ifNull , чтобы решить, что разместить в свойстве «sortfield» проецируемого документа в зависимости от того, какие данные имеются, а затем использовать это значение в рамках этапа конвейерной сборки $sort.

Вы можете также интегрировать обычные операции запроса с конвейером $match в начале конвейера, что было бы рекомендовано сократить документы, необходимые для обработки в $project.

Если документы, не содержащие требуемого поля, значение «sortfield» будет тогда выше ожидаемых значений, и эти документы будут отображаться в конце, а не в начале.

15
задан arielsan 7 March 2009 в 23:54
поделиться

4 ответа

Ну, Вы можете, если Вы хотите. Я не знаю, знакомы ли Вы с JMockit, пойдите, проверяют его. Текущая версия 0.999.17 Тем временем, давайте смотреть на нее...

Принимают следующую иерархию классов:

public class Bar {
    public void bar() {
        System.out.println("Bar#bar()");
    }
}

public class Foo extends Bar {
    public void bar() {
        super.bar();
        System.out.println("Foo#bar()");
    }
}

Затем с помощью JMockit в Вашем FooTest.java можно проверить это, Вы на самом деле звоните Bar от Foo.

@MockClass(realClass = Bar.class)
public static class MockBar {
    private boolean barCalled = false;

    @Mock
    public void bar() {
        this.barCalled = true;
        System.out.println("mocked bar");
    }
}

@Test
public void barShouldCallSuperBar() {
    MockBar mockBar = new MockBar();
    Mockit.setUpMock(Bar.class, mockBar);

    Foo foo = new Foo();
    foo.bar();

    Assert.assertTrue(mockBar.barCalled);

    Mockit.tearDownMocks();
}
12
ответ дан 1 December 2019 в 03:15
поделиться

Я не думаю, что дразнил бы вызов super - это чувствует мне как поведение существует часть поведения самого класса, а не поведения зависимости. Насмешка всегда чувствует, что должна относиться к зависимостям больше, чем что-либо еще.

у Вас есть хороший пример вида вызова, который Вы хотите дразнить? Если бы Вы хотите дразнить вызов как это, это был бы состав достойный рассмотрения вместо наследования?

4
ответ дан 1 December 2019 в 03:15
поделиться

перехват супервызова слишком детализирован. Не переусердствуйте с изоляцией.

-1
ответ дан 1 December 2019 в 03:15
поделиться

Есть несколько тестов, которые делают именно это (т. е. задают ожидаемый вызов метода суперкласса) с использованием JMockit Expectations API в тестовом наборе образцов анимированных переходов. Например, тестовый пример FadeInTest .

1
ответ дан 1 December 2019 в 03:15
поделиться
Другие вопросы по тегам:

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