public class TestedClass {
public LoginContext login(String user, String password) {
LoginContext lc = new LoginContext("login", callbackHandler);
lc.doThis();
lc.doThat();
}
}
- Класс тестирования:
@RunWith(PowerMockRunner.class)
@PrepareForTest(TestedClass.class)
public class TestedClassTest {
@Test
public void testLogin() {
LoginContext lcMock = mock(LoginContext.class);
whenNew(LoginContext.class).withArguments(anyString(), anyString()).thenReturn(lcMock);
//comment: this is giving mock object ( lcMock )
TestedClass tc = new TestedClass();
tc.login ("something", "something else"); /// testing this method.
// test the login's logic
}
}
При вызове фактического метода tc.login ("something", "something else");
из testLogin () {- этот LoginContext lc установлен в значение null и бросает NPE при вызове lc.doThis();
Проверьте свой math.h файл. Если Вы удачливы, что имеете nextafter
и nextafterf
функции, определяемые. Они делают точно, что Вы хотите портативным и независимым от платформы способом и являетесь частью стандарта C99.
Другой способ сделать оно (могло быть решение для нейтрализации) должно разложить Ваше плавание на часть экспоненты и мантиссу. Постепенное увеличение легко: Просто добавьте тот к мантиссе. Если Вы получаете переполнение, необходимо обработать это путем постепенного увеличения экспоненты. Постепенное уменьшение работает тот же путь.
РЕДАКТИРОВАНИЕ : Как указано в комментариях достаточно просто увеличить плавание в, он - двоичное представление. Переполнение мантиссы увеличит экспоненту, и это точно, что мы хотим.
Это - вкратце то же самое, которое делает nextafter.
Это не будет абсолютно портативно все же. Необходимо было бы иметь дело с порядком байтов и тем, что не все машины действительно имеют плавания IEEE (хорошо - последняя причина является более академической).
Также обрабатывающий NAN's и большое количество может быть немного хитрым. Вы не можете просто увеличить их, поскольку они - по определению не числа.
u64 &x = *(u64*)(&f);
x++;
Да, серьезно.
Редактирование: , Поскольку кто-то указал, это не имеет дело с-ve числами, Inf, Nan или переполнением правильно. Более безопасная версия вышеупомянутого
u64 &x = *(u64*)(&f);
if( ((x>>52) & 2047) != 2047 ) //if exponent is all 1's then f is a nan or inf.
{
x += f>0 ? 1 : -1;
}
В свободных членах самая маленькая сумма можно добавить к значению с плавающей точкой для создания нового отличного значения, будет зависеть от текущей величины значения; это будет эпсилон машины типа умноженный на текущую экспоненту.
Выезд спецификация IEEE для плавающей точки represenation. Самый простой путь состоял бы в том, чтобы дать иное толкование значению как целому типу, добавить 1, затем проверить (если Вы заботитесь), что Вы не зеркально отразили знак или генерировали NaN путем исследования битов экспоненты и знака.
, С другой стороны, Вы могли использовать frexp, чтобы получить текущую мантиссу и экспоненту, и следовательно вычислить значение для добавления.
Я должен был сделать ту же самую вещь и придумал этот код:
double DoubleIncrement(double value)
{
int exponent;
double mantissa = frexp(value, &exponent);
if(mantissa == 0)
return DBL_MIN;
mantissa += DBL_EPSILON/2.0f;
value = ldexp(mantissa, exponent);
return value;
}
Если это имеет значение значение, для которого стандарта ++ постепенное увеличение прекращает функционировать, 9,007,199,254,740,992.
Это не может быть точно, что Вы хотите, но Вы все еще могли бы найти numeric_limits в использования. Особенно членская минута (), и эпсилон ().
я не полагаю что что-то как mydouble + numeric_limits:: эпсилон () сделает то, что Вы хотите, если mydouble уже не близко к эпсилону. Если это, то Вы находитесь в удаче.
Я нашел этот код некоторое время назад, возможно, он поможет Вам определить самое маленькое, можно увеличить его, к тому времени просто увеличивают его тем значением. К сожалению, я не могу помнить ссылку за этот код:
#include <stdio.h>
int main()
{
/* two numbers to work with */
double number1, number2; // result of calculation
double result;
int counter; // loop counter and accuracy check
number1 = 1.0;
number2 = 1.0;
counter = 0;
while (number1 + number2 != number1) {
++counter;
number2 = number2 / 10;
}
printf("%2d digits accuracy in calculations\n", counter);
number2 = 1.0;
counter = 0;
while (1) {
result = number1 + number2;
if (result == number1)
break;
++counter;
number2 = number2 / 10.0;
}
printf("%2d digits accuracy in storage\n", counter );
return (0);
}