我正在设置要在Junit
中使用的课程。
但是,当我尝试执行以下操作时,我收到错误消息。
当前测试类:
public class PersonServiceTest {
@Autowired
@InjectMocks
PersonService personService;
@Before
public void setUp() throws Exception
{
MockitoAnnotations.initMocks(this);
assertThat(PersonService, notNullValue());
}
//tests
错误:
org.mockito.exceptions.base.MockitoException:
Cannot instantiate @InjectMocks field named 'personService'
You haven't provided the instance at field declaration so I tried to construct the instance.
However the constructor or the initialization block threw an exception : null
我该如何解决这个问题?
答案 0 :(得分:3)
你没有在代码中嘲笑任何东西。 @InjectMocks设置一个将注入模拟的类。
您的代码应如下所示
<?php
$cnt = 1; // VARIABLE FOR QUESTIONS //
$query = "SELECT * FROM questions";
$result = mysqli_query($connection, $query);
while ($row = mysqli_fetch_object($result))
{
$choices = explode ("|", $row->choices);
if(isset($_POST['submit_post']))
{ // eq - radio button name (choices) for $cnt - question # //
$choice = $_POST["eq$cnt"]; // What to do in this $_POST part? //
$query = "INSERT INTO users(answers)";
$query .= "VALUES ('{$choice}')";
$create_post_query = mysqli_query($connection, $query);
}
?>
<form action="" method="post">
<?php
if($row->num ==0)
{
$num=" ";
} else
{
$num=$row->num.". ";
}
?>
<p id="eqIdentify_<?php echo $cnt ?>"><strong><?php echo $num; echo $row->questions; ?></strong> <?php ?> <?php echo $cnt; ?>
<?php
// VARIABLE FOR CHOICES //
for($a=0;$a<count($choices);$a++)
{
?>
<br/><label><input type="radio" name="eq<?php echo $cnt;?>" value="<?php echo $choices[$a] ?>" /><?php echo $choices[$a]?></label>
<?php
}
?>
<?php
$cnt = $cnt + 1;
}
?>
<input type="submit" name="submit_post">
</form>
答案 1 :(得分:1)
另一种解决方案是使用@ContextConfiguration
注释和静态内部配置类,如下所示:
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader = AnnotationConfigContextLoader.class)
public class PersonServiceTest {
@Autowired
PersonService personService;
@Before
public void setUp() throws Exception {
when(personService.mockedMethod).thenReturn("something to return");
}
@Test
public void testPerson() {
assertThat(personService.method, "what you expect");
}
@Configuration
static class ContextConfiguration {
@Bean
public PersonService personService() {
return mock(PersonService.class);
}
}
}
无论如何,您需要模拟要测试的方法在内部使用的东西,以获得该方法的所需行为。嘲笑你正在测试的服务是没有意义的。
答案 2 :(得分:1)
你在这里误解了模拟的目的。
当你嘲笑这样一个类时,你假装它已被注入你的应用程序中。这意味着你不想注射它!
解决方案:设置您打算注入的任何bean @Mock
,并通过@InjectMocks
将它们注入到您的测试类中。
目前还不清楚你要注入的bean在哪里,因为你所拥有的只是定义的服务,但是...
@RunWith(MockitoJUnitRunner.class);
public class PersonServiceTest {
@Mock
private ExternalService externalSvc;
@InjectMocks
PersonService testObj;
}
答案 3 :(得分:0)
如果我没有弄错......拇指规则就是你不能同时使用它们......你要么使用MockitojunitRunner或SpringJUnitRunner来运行单元测试用例,你就不能同时使用它们。