java测试题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java测试题相关的知识,希望对你有一定的参考价值。

java测试题:先随机生成x个1到100的整数,再找出这x个随机整数中大于等于y(1<y<100)的,并且连续次数大于或等于z的数据,输出这些数据;希望代码简单些

public static void main(String[] args)
int x = 0, y = 0, z = 0;

BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));

try
System.out.println("please input X (X > 0):");
x = Integer.valueOf(bf.readLine());

if (x <= 0 )
System.out.println("X is OutOfBound.");
System.exit(1);


System.out.println("please input Y(1 < Y < 100):");
y = Integer.valueOf(bf.readLine());

if (y <= 1 || y >= 100)
System.out.println("Y is OutOfBound.");
System.exit(1);


System.out.println("please input Z (Z > 0):");
z = Integer.valueOf(bf.readLine());
if (z <= 0 )
System.out.println("Z is OutOfBound.");
System.exit(1);

catch (NumberFormatException nfe)
nfe.printStackTrace();
catch (IOException ioe)
ioe.printStackTrace();


// with x create random
Random random = new Random();
int[] array = new int[x];

System.out.print("print:");
for (int i = 0; i < array.length; i++)
array[i] = random.nextInt(100);
System.out.print(array[i] + " ");


System.out.println("");

List<Integer> list = new ArrayList<Integer>(0);
int i = 0;
while (i < array.length)
int j = i;
for (; j < array.length; j ++)
if (array[j] > y)
list.add(array[j]);
else
break;



i = j + 1;

if (list.size() > z)
for (int k = 0 ; k < list.size() ; k++)
System.out.print(list.get(k) + " ");

System.out.println("");


list = new ArrayList<Integer>(0);

参考技术A 你这个问题的输出结果格式没有很明确的说明,我就是把每z个大于等于y的数一起输出了

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test

private static Random random = new Random();
private int x;
private int y;
private int z;
private int[] numbers;
private List<Integer> lists = new ArrayList<Integer>();
private List<String> list = new ArrayList<String>();

/**
* @return 输入条件
* @throws Exception
*/
public String input() throws Exception
System.out.println("请输入x的值(1~100):");
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String msg = in.readLine();
if (isNumeric(msg))
x = Integer.parseInt(msg);
else
return "x不符合要求";

System.out.println("请输入y的值(1~100):");
msg = in.readLine();
if (isNumeric(msg))
y = Integer.parseInt(msg);
if (y <= 1 || y >= 100)
return "y不符合要求";

else
return "y不符合要求";


System.out.println("请输入z的值(1~100):");
msg = in.readLine();
if (isNumeric(msg))
z = Integer.parseInt(msg);
else
return "z不符合要求";

return "随机生成" + x + "个1到100的整数,再找出这些随机整数中大于等于" + y + "的,并且连续次数大于或等于"
+ z + "的数据";



/**
* 计算数据
*/
public void count()
numbers = new int[x];
for (int i = 0; i < x; i++)
numbers[i] = random.nextInt(100) + 1;
if (numbers[i] >= y)
lists.add(numbers[i]);



for (int i = 0; i < lists.size(); i++)
boolean isCheck = true;
for (int j = 0; j < z; j++)
try
if (lists.get(i + j)<y)
isCheck = false;

catch (IndexOutOfBoundsException e)
isCheck = false;
continue;




if (isCheck)
String str = "";
for (int j = i; j < i+z; j++)
str += lists.get(j)+",";

list.add(str);




/**
* 输出结果
*/
public void show()
System.out.print("随即生成的" + x + "个数");
for (int i = 0; i < x; i++)
System.out.print("," + numbers[i]);

System.out.print("\n大于" + y + "的数");
for (Integer i : lists)
System.out.print("," + i);

System.out.print("\n满足条件的结果:");
for (String i : list)
System.out.println(i);




public static void main(String[] args) throws Exception
Test test = new Test();
String str = test.input();
System.out.println(str);
if (!str.equals("x不符合要求") && !str.equals("y不符合要求")
&& !str.equals("z不符合要求"))
test.count();
test.show();




/**
* 判断字符串是否为数字组成的
* @param str
* @return
*/
public static boolean isNumeric(String str)
if (str == null)
return false;

Pattern pattern = Pattern.compile("[0-9]+");
Matcher isNum = pattern.matcher(str);
if (!isNum.matches())
return false;

return true;

本回答被提问者采纳
参考技术B 连续次数我不明白是什么意思?我理解为循环的次数,如果不是,请标明下,我在改改,大概流程就是下面的程序,如果满意,请采纳:

public static void main(String args[])
Random t=new Random();
int[] x=new int[100];
for(int i=0;i<x.length;i++)
x[i]=t.nextInt(100)+1;

System.out.print("随机选取100个数字(1-100):");
for(int a:x)
System.out.print(a+"\t");


System.out.println();
System.out.print("随机选取一个Y(1<y<100):");
int y=t.nextInt(99)+2;
System.out.print(y);

System.out.println();
System.out.print("随机选取一个z:");
int z=t.nextInt(100)+1;
System.out.println(z);

System.out.print("x个随机整数中大于等于y(1<y<100)的,并且连续次数大于或等于z的数据:");
for(int i=0;i<x.length;i++)
if((i+1)>=z)//循环次数大于Z
if((x[i]>=y) )//x>y
System.out.print(x[i]+"\t");



追问

比如y=28,连续有几个数38,35,29,72都大于28,连续个数就为4,当连续数个数大于z时,输出这若干个数据,谢谢前辈啊,我是初学者

Java / Spring:无法在单元测试中测试缓存

【中文标题】Java / Spring:无法在单元测试中测试缓存【英文标题】:Java / Spring: Cannot test Caching in Unit Test 【发布时间】:2021-11-17 15:59:02 【问题描述】:

在我的 Java 应用程序中,我尝试使用单元测试来测试以下服务方法:

@Service
@EnableCaching
@RequiredArgsConstructor
public class LabelServiceImpl implements LabelService 

    private static final String CACHE_NAME = "demoCache";

    private final LabelRepository labelRepository;


    @Override
    public List<LabelDTO> findByUuid(UUID uuid) 
        final Label label = labelRepository.findByUuid(uuid)
                .orElseThrow(() -> new EntityNotFoundException("Not found."));
        final List<LabelDTO> labelList = labelRepository.findByUuid(uuid);
        return labelList;
    

这是我的单元测试:

@Import(CacheConfig.class, LabelServiceImpl.class)
@ExtendWith(SpringExtension.class)
@EnableCaching
@ImportAutoConfiguration(classes = 
        CacheAutoConfiguration.class,
        RedisAutoConfiguration.class
)
@RunWith(MockitoJUnitRunner.class)
public class CachingTest 

    @InjectMocks
    private LabelServiceImpl labelService;

    @Autowired
    private CacheManager cacheManager;


    @Mock
    private LabelRepository labelRepository;


    @Test
    void givenRedisCaching_whenFindUuid_thenReturnFromCache() 

        //code omitted 
        
        LabelDTO labelFromDb = labelService.findByUuid(uuid);
        LabelDTO labelFromCache = labelService.findByUuid(uuid);
        verify(labelRepository, times(1)).findByUuid(uuid);
    

当我在单元测试中将@Autowired 用于LabelServiceImpl 时,我收到“Nullpointer 异常”错误。如果我对该实例使用@InjectMocks 注释,则不会出现错误,但不会进行缓存(它调用labelService.findByUuid 2 次而不是1 次)。

我认为我犯了与单元测试类中的注释有关的错误,但我尝试了许多不同的组合并不能解决问题。

那么,我该如何解决这个问题?

更新:最后我使用以下方法解决了这个问题。但是,我还必须将mockito-core 版本从3.3.3 更新为3.7.0,如下所示。否则我会收到“java.lang.NoSuchMethodError: org.mockito.MockitoAnnotations.openMocks(Ljava/lang/Object;)Ljava/lang/Au​​toCloseable;”错误。

pom.xml:

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>3.7.0</version>
    <scope>test</scope>
</dependency>

缓存测试:

@ExtendWith(MockitoExtension.class)
@SpringBootTest
public class CachingTest 

    @Autowired
    @InjectMocks
    private LabelServiceImpl labelService;
        
    @MockBean
    private LabelRepository labelRepository;

    @Test
    public void givenRedisCaching_whenFindUuid_thenReturnFromCache() 
        //code omitted 
        
        LabelDTO labelFromDb = labelService.findByUuid(uuid);
        LabelDTO labelFromCache = labelService.findByUuid(uuid);
        verify(labelRepository, times(1)).findByUuid(uuid);
        assertEquals(labelFromDb, labelFromCache);              
    

【问题讨论】:

请不要再问同样的问题,而是改写或澄清您就此提出的其他问题。正如我在另一篇文章中所说,您的测试没有意义,大多数注释都是无用的,您期望在没有向测试中添加弹簧功能的模拟模拟将测试弹簧功能。这当然不会发生。 Autowire LabelService 不是 impl,放弃所有注释,只需添加 @SpringBootTest 并将 @Mock 替换为 @MockBean。我记得对您的另一个问题(似乎已被删除)给出了相同的答案/评论。 非常感谢。如果我使用 @SpringBootTest 注释,我会得到 labelService 的“java.lang.NullPointerException”(我也将其更改为接口 -> LabelService)。 另一方面,如果我在 @SpringBootTest 之外添加 @RunWith(SpringRunner.class),那么我会得到 "java.lang.IllegalArgumentException: Cannot find cache named 'demoCache' for Builder[public java. util.List com.mycompany.service.impl.LabelServiceImpl.findByUuid(UUID)] caches=[demoCache] | key='' | keyGenerator='' | cacheManager='' | cacheResolver='' | condition='' | 除非='' | sync='false'" 错误。 但是我认为我们非常接近解决方案,因为它会查找缓存,但无法找到该名称。 我也试过在我的测试类上添加@EnableCaching注解,但还是同样的问题。 如果您使用的是 junit4(我假设为 5),您还需要 @RunWith。您需要配置缓存管理器以创建该缓存(显然您使用的缓存不支持即时创建)。 【参考方案1】:

Mockito 不会模拟您的 springt 启动应用程序。它只是模拟带注释的对象并将您的模拟对象注入到您的 labelService 中。

另一方面,测试 Spring Boot 应用程序 @Autowired 是不够的。

您必须构建一个 Spring Boot 集成测试。 为此,请使用 @SpringBootTest 注释您的测试。 这会初始化一个真正的应用程序上下文。

尝试自动装配,LabelService

package com.demo;

import org.springframework.stereotype.Service;
@Service
public class LabelService

    public String getLabel()
    
        return "Test Label " + System.currentTimeMillis();
    


package com.demo;

import static org.junit.jupiter.api.Assertions.assertNotNull;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class CachingTest

    @Autowired
    private LabelService labelService;

    @Test
    public void testLabelService()
    
        assertNotNull(labelService);
    

这行得通

【讨论】:

谢谢安德烈亚斯,我也试过@SpringBootTest,但labelService 为空(我通过@Autowired 对其进行了注释。有任何想法吗? 尝试自动装配,LabelService 我在回答中添加了一个示例 我的更新呢?它现在正在工作,我认为可以通过 Unit Test 以及集成测试来测试缓存。关于更新代码的任何评论?可以吗,或者你有什么相关的建议吗? @Robert 请在link查看我的回答。

以上是关于java测试题的主要内容,如果未能解决你的问题,请参考以下文章

Java web 中如何测试Java类

Java单元测试

java测试题

如何使用Spring + EasyMock做Java单元测试

java基础测试题

怎么写Java测试代码?