Если договор класса A включает в себя тот факт, что он вызывает метод B объекта типа C, тогда вы должны проверить это, сделав макет типа C и проверив, что метод B. был вызван.
Это означает, что контракт класса A имеет достаточно подробные сведения о том, что он говорит о типе C (который может быть интерфейсом или классом). Итак, да, мы говорим о уровне спецификации, который выходит за рамки только «системных требований» и имеет некоторый способ описания реализации.
Это нормально для модульных тестов. Когда вы проводите модульное тестирование, вы хотите, чтобы каждый блок выполнял «правильную вещь» и обычно включал его взаимодействие с другими подразделениями. «Единицы» здесь могут означать классы или более крупные подмножества вашего приложения.
Обновление:
Я чувствую, что это не относится только к проверке, но и к тому, чтобы нанести удар. Как только вы закроете метод класса соавторов, ваш модульный тест стал в некотором смысле зависимым от реализации. По сути, это характерные модульные тесты. Поскольку Mockito так же остужает, как и о проверке, тот факт, что вы используете Mockito, подразумевает, что вы будете сталкиваться с такой зависимостью.
По моему опыту, если я изменить реализацию класса, мне часто приходится менять реализацию своих модульных тестов для соответствия. Однако, как правило, мне не придется менять инвентаризацию того, какие модульные тесты существуют для класса; если, разумеется, причиной изменения было наличие условия, которое я ранее не тестировал.
Итак, это то, что относятся к элементарным тестам. Тест, который не страдает от такой зависимости от того, как используются классы соавторов, действительно является подсистемным тестом или тестом интеграции. Конечно, они часто пишутся вместе с JUnit и часто включают в себя использование насмешек. По моему мнению, «JUnit» - ужасное имя, для продукта, который позволяет нам производить все различные типы тестов.
При контакте с многомерными данными я полагаю, что две нейронных сети слоя, как говорят, дают лучший результат.
В Вашем случае:
R[0..1] => (N1)----\
\
G[0..1] => (N2)-----(N4) => Result[0..1]
/
B[0..1] => (N3)----/
, Как Вы видите, нейрон N4 может обработать 3 записи.
[0.. 1] интервал является конвенцией, но хорошей imo. Тем путем можно легко кодировать ряд универсальных классов нейрона, которые могут взять произвольное число записей (у меня были шаблонные классы C++ с количеством записей как шаблонный параметр лично). Таким образом, Вы кодируете логику своих нейронов однажды, тогда Вы играете со структурой сети и/или комбинациями функций в Ваших нейронах.
Обычно единственный нейрон берет в качестве его входа несколько вещественных чисел и производит вещественное число, которое обычно вычисляется как применение сигмовидной функции к сумме вещественных чисел (масштабируемый, и затем плюс или минус постоянное смещение).
, Если Вы хотите вставить, скажем, два вектора RGB (реалы 2 x 3), необходимо решить, как Вы хотите объединить значения. Если Вы добавляете все элементы вместе и применяете сигмовидную функцию, это эквивалентно входу "плоские" шесть реалов. С другой стороны, если Вы обрабатываете элементы R, тогда элементы G и элементы B, все индивидуально (например, суммируете или вычитаете пар), у Вас есть на практике три независимых нейрона.
Так короче говоря, нет, единственный нейрон не берет в векторных значениях.
Это может быть тем, что Вы хотите, пока Вы пишете свою внутреннюю функцию соответственно.
примеры Вы упоминаете использование [0; 1] как их домен, но можно использовать R, RВІ, или независимо от того, что Вы хотите, пока функция, которую Вы используете в своих нейронах, определяется на этом домене.
В Вашем случае, можно определить функции на R3, чтобы позволить, чтобы значения RGB были обработаны
А тривиальный пример: используйте (x1, y1, z1), (x2, y2, z2)-> (ax1+x2, by1+y2, cz1+z2) как Ваша функция для преобразования двух цветов в один, b и c быть приобретением знаний чепцов, которые Вы определите во время фазы изучения.
Очень подробная информация (включая ответ на Ваш вопрос) доступна на Википедию .